有我的代码:
file1.go:
type ErrorCode Int32
var result ErrorCode
file2.pb.go:
type CollectionGC struct {
Result *ErrorCode `protobuf:"varint,1,opt,name=result,enum=api.ErrorCode" json:"result,omitempty"`
XXX_unrecognized []byte `json:"-"`
}
messageGC := &CollectionGC {
Result: result, // a error occurs
}
这给出了:
Invalid assignment from result(ErrorCode) to Result(*ErrorCode), and fun CollectionGC.SetResult(value int32) is nonexisted in file2.pb.go.
如何避免此错误?
答案 0 :(得分:1)
作为第一个测试,如果Result(*ErrorCode)
期望指针作为其参数,您至少可以给它一个:
Result: &result
^
- pointer to result
正如“Golang - Asterisk and Ampersand Cheatsheet”(Joseph Spurrier)总结:
p := Person{"Hillary", 28} stores the value
p := &Person{"Hillary", 28} stores the pointer address (reference)
PrintPerson(p) passes either the value or pointer address (reference)
PrintPerson(*p) passes the value
PrintPerson(&p) passes the pointer address (reference)
来自piotrzurek的“Pointers in Go. Short tale of asterisk and ampersand.”:
&
用于检索存储此变量值的地址。该地址是指针要存储的地址。
*
意味着声明的变量将存储该类型的另一个变量的地址(不是该类型的值)。
*
用于检索存储在给定地址的值。在Go中,这称为解除引用。
参见 play.golang.org 。