go grpc

如下命令的含义:

protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

--go_out生成helloworld.pb.go
--go-grpc_out生成helloworld_grpc.pb.go
--go_opt=paths=source_relative 是告诉 protoc 命令使用相对路径生成 Go 代码。

出现错误:

protoc-gen-go: unable to determine Go import path for "image.proto"

请在proto上添加如下语句:

option go_package = "./image";

如下代码中使用模块名pd导入函数Hello,函数Hello的查找过程如下:会从模块pd中所有包中查找函数Hello,如果所有包中只有一个名为Hello的函数,则直接调用Hello;如果函数Hello存在于多个包中,那么就会出现提示。

package main

import (
    "fmt"

    pd "example.com/greetings"
)

func main() {
    // Get a greeting message and print it.
    message := pd.Hello("Gladys")
    fmt.Println(message)
}




goimport只能用于导入模块,不能用于导入包吗?

用于生成go语言代码的proto文件,必须含有类似如下的字段:

option go_package = "./p_image";

以上字段生成的go代码的package为p_image。

import只能导入模块,不能导入模块中的包吗?

protoc --go_out=go_client/paddle_ocr --go_opt=paths=source_relative \
   --go-grpc_out=go_client/paddle_ocr --go-grpc_opt=paths=source_relative \
   protos/paddle_ocr.proto 

代码会生成在go_client/paddle_ocr/protos下,因为protoc指向的文件为 protos/paddle_ocr.protoprotos/paddle_ocr.proto中的protos会加在go_client/paddle_ocr后面,形成go_client/paddle_ocr/protos。至于为什么会这样,我也不知道,记住就行。

在 Go 语言中,包名和目录名可以不同。但是,如果一个包要被其他包引用,那么这个包的包名必须与其所在的目录名一致。

同一个目录下可以定义不同包的go文件,并且go文件之间可以互相引用吗
go语言中,同一个目录下可以定义不同包的go文件,并且go文件之间可以互相引用吗,具体解释如下:

在 Go 语言中,同一个目录下可以定义不同的包,但是不同包之间的文件不能直接引用,需要使用 import 关键字引入其他包的内容才能使用。但是同一个包下的不同文件可以互相引用。

具体地说,如果在同一个目录下定义了两个不同的包,例如:

go
Copy code
example/
├── foo/
│ └── foo.go
└── bar/
└── bar.go
foo.go 和 bar.go 分别定义了不同的包 foo 和 bar。如果要在 bar.go 中使用 foo 包中的函数或变量,需要在 bar.go 中使用 import 关键字引入 foo 包:

go
Copy code
package bar

import "example/foo"

func Bar() {
foo.Foo()
}
但是同一个包下的不同文件可以直接互相引用,例如在 foo.go 中可以直接使用 bar.go 中的函数或变量,无需使用 import:

go
Copy code
package foo

func Foo() {
bar.Bar()
}

hhh z
没有 foo/和bar/两个目录,而是直接将foo.go和bar.go放在example/目录下是否可以
是的,即使 foo.go 和 bar.go 直接放在同一个目录 example/ 下而不是分别放在两个子目录 foo/ 和 bar/ 下,它们仍然可以定义不同的包并相互引用。

在这种情况下,我们可以将 foo.go 和 bar.go 的包名分别设置为 foo 和 bar,如下所示:

go
Copy code
example/
├── foo.go
└── bar.go
foo.go 的代码:

go
Copy code
package foo

import "example/bar"

func Foo() {
bar.Bar()
}
bar.go 的代码:

go
Copy code
package bar

import "example/foo"

func Bar() {
foo.Foo()
}
注意,在这种情况下,我们必须确保 foo.go 和 bar.go 的包名与文件名相同,否则 Go 编译器会报错。此外,如果我们想将这两个文件打包成一个可执行文件,需要确保它们都属于同一个包,否则编译器也会报错。

posted @   好人~  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示