• Geek_338030
    2019-09-09
    没讲context是干嘛的,直接就讲用来取消关联任务,感觉云里雾里的。

    作者回复: context就是用于管理相关任务的上下文,包含了共享值的传递,超时,取消通知
    type Context interface {
        Deadline() (deadline time.Time, ok bool)
        Done() <-chan struct{}
        Err() error
        Value(key interface{}) interface{}
    }
    Deadline会返回一个超时时间,Goroutine获得了超时时间后,例如可以对某些io操作设定超时时间。

    Done方法返回一个信道(channel),当Context被撤销或过期时,该信道是关闭的,即它是一个表示Context是否已关闭的信号。

    当Done信道关闭后,Err方法表明Context被撤的原因。

    Value可以让Goroutine共享一些数据,当然获得数据是协程安全的。但使用这些数据的时候要注意同步,比如返回了一个map,而这个map的读写则要加

    
     2
  • 南宫云遥子
    2019-04-28
    `cancel()`这里为啥不用向cancel传入ctx,像这样`cancel(ctx)`,我知道`ctx, cancel := context.WithCancel(context.Background())`这里返回的就是不用传参,不明白为啥不用传参,请老师解答一下,谢谢!
    ```
    func TestCancelRelative(t *testing.T){
        // use context.WithCancel() to create cancel context signal, use context.Background() to get context
        ctx, cancel := context.WithCancel(context.Background())
        for i := 0; i < 10; i++ {
            // use context.Context definded a context
            go func(i int, ctx context.Context){
                for {
                    // cancel single task
                    //if isCancel(cancelChan){

                    // cancel relative task
                    if isCancelRelative(ctx){
                        break
                    }
                    time.Sleep(1 * time.Second)
                }
                fmt.Println(i, "done!")
            }(i, ctx)
        }
        cancel()

        // cancel(ctx)
        //raise error: too many arguments in call to cancel, have (context.Context), want()

        time.Sleep(1 * time.Second)
    }
    ```
    展开

    作者回复: 这个cancel就是由相关的context生成的。参考下面的实例代码:
    package cancel_with_ctx

    import (
        "fmt"
        "testing"
    )

    func WithContext(ctx int) (Cancel func()) {
        return func() {
            fmt.Println("The value of ctx is ", ctx)
        }
    }

    func TestWithContext(t *testing.T) {
        cancel := WithContext(10)
        cancel()
        //output: The value of ctx is 10
    }

     1
     1
  • Geek_fa647d
    2019-03-24
    老师,go有类似java中spring clound这种微服务框架吗?

    作者回复: 推荐你一个,简单的
    https://github.com/easierway/service_decorators/blob/master/README.md

    
     1
  • 虢國技醬
    2019-08-11
    ctx, cancel := context.WithCancel(context.Background())

        for i := 0; i < 30; i++ {
            go func(i int) {
                for {
                    if isCancelled(ctx) {
                        break
                    } else {
                        // fmt.Println(i, "Not Yet")
                    }
                    time.Sleep(time.Millisecond * 5)
                }
                fmt.Println(i, "Canceled")
            }(i)
        }

    go func(i int) 也可以直接利用闭包特性直接使用ctx,因为for启动多个goroutine时ctx是公用的、不变的。go func(i int) 函数启动时内部的ctx用的是外部ctx,此时内部的ctx由不确定变为确定(由开放到闭合)
    展开
    
    
  • 喂喂喂
    2019-04-16
    蔡超老师你好,在本节的例子中,您是不是没有通过子 context 来创建任务?
    
    
  • 云学
    2019-03-30
    项目中在用go语言,老师点拨的很好
    
    
我们在线,来聊聊吧