1

当一个 golang gRPC 服务器调用一个处理函数时,传递的 ctx 值是从这里创建的私有顶层上下文派生的,在 grpc 传输层:
/go/pkg/mod/google.golang.org/grpc@v1.27.0/internal/transport/http2_server.go:219

t := &http2Server{
        ctx:               context.Background(),
        done:              done,
        conn:              conn,
        remoteAddr:        conn.RemoteAddr()
         ...

为什么该上下文不是从服务器构建时提供的根上下文派生的,有什么原因吗?

也许grpc.NewServer(opt ...ServerOption)可以有一个 ctx 变体grpc.NewServerCtx(ctx, ...ServerOption)

这将为您提供传输您希望所有上下文包含的值的选项。

4

1 回答 1

0

我认为这是一个非常好的问题。答案是,因为该包不可用于外部调用,为什么要导出某些东西,而不允许任何人使用该包?

但为什么它是一个私人包?

让我们看看你的文件的路径:

/google.golang.org/grpc@v1.27.0/internal/transport/http2_server.go:219

内部是这里的关键:

/google.golang.org/grpc@v1.27.0/internal/

该路径内的所有内容都仅用于包。

因此,对于该代码,您显示外部没有人能够使用该包。所以里面的所有东西都可以不导出。

于 2020-03-06T19:26:22.813 回答