2016-07-16 3 views
2

Есть мои коды:как assgin ERRORCODE (int32) к переменной (* ErrorCode) из прото данных

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. 

Как избежать этой ошибки?

ответ

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) 

Также «Pointers in Go. Short tale of asterisk and ampersand.» от piotrzurek:

  • & перед именем переменной используется для получения адреса, в котором хранится значение этой переменной. Этот адрес будет хранить указатель.

  • * перед именем типа означает, что объявленная переменная будет хранить адрес другой переменной этого типа (а не значение этого типа).

  • * перед переменной типа указателя используется для извлечения значения, хранящегося на заданном адресе. В Go говорят, что это называется разыменование.

См play.golang.org.

+0

Я пробовал «Результат: * результат», и теперь я знаю, что случилось с моим умом ... Спасибо за ваше время и ответ! – Tal

+0

@Tal да, https://gist.github.com/josephspurrier/7686b139f29601c3b370 хорошо читается – VonC

+0

Вау, эти коды точно используют мою потребность. Он имеет ясный ум – Tal