goコンテキスト転送context

4165 ワード

goにはchannal,slick,map,interface,funcなどがあり,funcがパラメータとして伝達できるこの機能も多くの動的言語でサポートされている.今、使い方を見てみましょう.

import (
    "fmt"
)

type Do struct {
    Name string
}

func (this Do) Lock() {
    fmt.Println(this.Name + " Lock ...")
}

func (this Do) UnLock() {
    fmt.Println(this.Name + " Unlock ~")
}

//          
func Say() {
    do := Do{Name: "Say"}
    do.Lock()
    defer do.UnLock()
    fmt.Println("say doing")
}
//          
func Fuck() {
    do := Do{Name: "Fuck"}
    do.Lock()
    defer do.UnLock()
    fmt.Println("fuck doing")
}

//    -withContext
func withDoContext(fn func()) {
    do := Do{Name: "do"}
    do.Lock()
    defer do.UnLock()

    fn()
}

func Quit() {
    withDoContext(func() {
        fmt.Println("quit doing")
    })
}

func Reboot() {
    fmt.Println("reboot doing")
}

//       context

//    -withContext
func withDoContextString(fn func() string) string {
    do := Do{Name: "do"}
    do.Lock()
    defer do.UnLock()

    return fn()
}

func main() {
    fmt.Println("Start Main func()")
    Say()
    Fuck()
    //    
    Quit()
    withDoContext(Reboot)

    msg := withDoContextString(func() string { return "hahah" })
    fmt.Println("msg ", msg)
}

出力:
Start Main func()
Say Lock ...
say doing
Say Unlock ~
Fuck Lock ...
fuck doing
Fuck Unlock ~
do Lock ...
quit doing
do Unlock ~
do Lock ...
reboot doing
do Unlock ~
do Lock ...
do Unlock ~
msg  hahah