代码之家  ›  专栏  ›  技术社区  ›  Nic

更新到1.15或更高版本后出现错误“紧急:无法从零父级创建上下文”

go
  •  0
  • Nic  · 技术社区  · 4 年前

    恐慌:无法从零父级创建上下文

    testing.tRunner.func1.2(0x1211480,0x12a3dc8)/usr/local/opt/go/libexec/src/testing/testing.go:1143 +0x332 testing.tRunner.func1(0xc000178900)/usr/local/opt/go/libexec/src/testing/testing.go:1146+0x4b6 /usr/local/opt/go/libexec/src/runtime/panic.go:965+0x1b9 context.WithValue(0x0、0x0、0x1210940、0x12a3f58、0x1241b80、, 0xc00007c910、0x12a3f58、0xc00004a770) /usr/local/opt/go/libexec/src/context/context.go:521+0x187 /usr/local/opt/go/libexec/src/context/context.go:521+0x187

    这是我的代码:

    ctx := context.WithValue(nil, "some string", nil)
    req := http.Request{}
    req = *req.WithContext(ctx)
    
    1 回复  |  直到 4 年前
        1
  •  2
  •   Mihai    4 年前

    任用 context.Background() context.TODO()

    您可以在这里看到,文档说context.Background()应该用作初始种子。 https://pkg.go.dev/context#Background

    func背景 后台返回一个非零的空上下文。它从未被取消,没有值,也没有截止日期。它通常由主函数、初始化和测试使用,并作为传入请求的顶级上下文。

    一般来说,你不应该把零放在第一位。

        2
  •  0
  •   Nic    4 年前

    根据 Go 1.15 documentation 不再允许传入零父级:

    现在可以显式地使用nil父级创建派生上下文 不允许。使用WithValue、WithDeadline或 WithCancel功能将导致死机。

    为了解决这个问题,我最终使用了 context.TODO() :

    ctx := context.WithValue(context.TODO(), "some string", nil)
    

    当不清楚要使用哪个上下文或它还不可用时 (因为周围的函数尚未扩展到接受 上下文参数)。