From 1c42092310db63c9f0cdb42a8a7ed39787cb4a80 Mon Sep 17 00:00:00 2001 From: sfw Date: Mon, 30 Jul 2018 19:53:40 +0800 Subject: [PATCH 1/5] fixed typos --- ch4-rpc/ch4-02-pb-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch4-rpc/ch4-02-pb-intro.md b/ch4-rpc/ch4-02-pb-intro.md index 3be18f3..95fe4a1 100644 --- a/ch4-rpc/ch4-02-pb-intro.md +++ b/ch4-rpc/ch4-02-pb-intro.md @@ -279,7 +279,7 @@ func (p *netrpcPlugin) buildServiceSpec(svc *descriptor.ServiceDescriptorProto) } ``` -其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义对服务对名字。Protobuf文件中的名字转为Go语言对名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`类型对应的类对象信息,最后获取类对象的名字。 +其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义的服务的名字。Protobuf文件中的名字转为Go语言对名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`类型对应的类对象信息,最后获取类对象的名字。 然后我们就可以基于buildServiceSpec方法构造的服务的元信息生成服务的代码: From 9c022e0ee98de6d7bd58b2028785f586c80d62e6 Mon Sep 17 00:00:00 2001 From: sfw Date: Mon, 30 Jul 2018 21:20:16 +0800 Subject: [PATCH 2/5] fixed typo --- ch4-rpc/ch4-02-pb-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch4-rpc/ch4-02-pb-intro.md b/ch4-rpc/ch4-02-pb-intro.md index 95fe4a1..a373948 100644 --- a/ch4-rpc/ch4-02-pb-intro.md +++ b/ch4-rpc/ch4-02-pb-intro.md @@ -232,7 +232,7 @@ $ protoc --go-netrpc_out=plugins=netrpc:. hello.proto ## 自动生成完整的RPC代码 -在前面的例子中我们已经构件了最小化的netrpcPlugin插件,并且通过克隆protoc-gen-go的主程序创建了新的protoc-gen-go-netrpc的插件程序。现在开始继续完善netrpcPlugin插件,最终目标是生成RPC安全接口。 +在前面的例子中我们已经构建了最小化的netrpcPlugin插件,并且通过克隆protoc-gen-go的主程序创建了新的protoc-gen-go-netrpc的插件程序。现在开始继续完善netrpcPlugin插件,最终目标是生成RPC安全接口。 首先是自定义的genImportCode方法中生成导入包的代码: From ee884a517df1f049c6911e8d55805b320003b891 Mon Sep 17 00:00:00 2001 From: sfw Date: Mon, 30 Jul 2018 22:03:08 +0800 Subject: [PATCH 3/5] fixed typo --- ch4-rpc/ch4-02-pb-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ch4-rpc/ch4-02-pb-intro.md b/ch4-rpc/ch4-02-pb-intro.md index a373948..29a156f 100644 --- a/ch4-rpc/ch4-02-pb-intro.md +++ b/ch4-rpc/ch4-02-pb-intro.md @@ -279,7 +279,7 @@ func (p *netrpcPlugin) buildServiceSpec(svc *descriptor.ServiceDescriptorProto) } ``` -其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义的服务的名字。Protobuf文件中的名字转为Go语言对名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`类型对应的类对象信息,最后获取类对象的名字。 +其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义的服务的名字。Protobuf文件中的名字转为Go语言对名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`获取类型对应的类对象信息,最后获取类对象的名字。 然后我们就可以基于buildServiceSpec方法构造的服务的元信息生成服务的代码: From 896238910585557e798212cca6d216dd12ab04b8 Mon Sep 17 00:00:00 2001 From: sfw Date: Tue, 31 Jul 2018 18:35:53 +0800 Subject: [PATCH 4/5] fixed code --- ch4-rpc/ch4-02-pb-intro.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/ch4-rpc/ch4-02-pb-intro.md b/ch4-rpc/ch4-02-pb-intro.md index 29a156f..ed92ad9 100644 --- a/ch4-rpc/ch4-02-pb-intro.md +++ b/ch4-rpc/ch4-02-pb-intro.md @@ -285,18 +285,16 @@ func (p *netrpcPlugin) buildServiceSpec(svc *descriptor.ServiceDescriptorProto) ```go func (p *netrpcPlugin) genServiceCode(svc *descriptor.ServiceDescriptorProto) { - for _, svc := range file.Service { - spec := p.buildServiceSpec(svc) + spec := p.buildServiceSpec(svc) - var buf bytes.Buffer - t := template.Must(template.New("").Parse(tmplService)) - err := t.Execute(&buf, spec) - if err != nil { - log.Fatal(err) - } - - p.P(buf.String()) + var buf bytes.Buffer + t := template.Must(template.New("").Parse(tmplService)) + err := t.Execute(&buf, spec) + if err != nil { + log.Fatal(err) } + + p.P(buf.String()) } ``` From 6487ac2c2eeca8dc3d4a8920532fb025b9904133 Mon Sep 17 00:00:00 2001 From: sfw Date: Tue, 31 Jul 2018 18:57:19 +0800 Subject: [PATCH 5/5] fixed typos --- ch4-rpc/ch4-02-pb-intro.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ch4-rpc/ch4-02-pb-intro.md b/ch4-rpc/ch4-02-pb-intro.md index 29a156f..3c5578b 100644 --- a/ch4-rpc/ch4-02-pb-intro.md +++ b/ch4-rpc/ch4-02-pb-intro.md @@ -168,7 +168,7 @@ func init() { } ``` -因为Go语言的包只能静态导入,我们无法向已经安装的protoc-gen-go添加我们新编写的插件。我们将重新克隆protoc-gen-go对应main函数: +因为Go语言的包只能静态导入,我们无法向已经安装的protoc-gen-go添加我们新编写的插件。我们将重新克隆protoc-gen-go对应的main函数: ```go package main @@ -279,7 +279,7 @@ func (p *netrpcPlugin) buildServiceSpec(svc *descriptor.ServiceDescriptorProto) } ``` -其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义的服务的名字。Protobuf文件中的名字转为Go语言对名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`获取类型对应的类对象信息,最后获取类对象的名字。 +其中输入参数是`*descriptor.ServiceDescriptorProto`类型,完整描述了一个服务的所有信息。然后通过`svc.GetName()`就可以获取Protobuf文件中定义的服务的名字。Protobuf文件中的名字转为Go语言的名字后,需要通过`generator.CamelCase`函数进行一次转换。类似的,在for循环中我们通过`m.GetName()`获取方法的名字,然后再转为Go语言中对应的名字。比较复杂的是对输入和输出参数名字的解析:首先需要通过`m.GetInputType()`获取输入参数的类型,然后通过`p.ObjectNamed`获取类型对应的类对象信息,最后获取类对象的名字。 然后我们就可以基于buildServiceSpec方法构造的服务的元信息生成服务的代码: