1、可见性。Packages里的首字母大写的变量表示是export的。struct中成员如果也要在package外用,那成员变量名首字母要大写。
2、json Decode时的大小写。
在使用encoding/json进行decode时,struct相关变量需要大写。例如我们有string
{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}
需要decode,我们定义struct
type BtcRpcRequest struct {
Jsonrpc string `json:jsonrpc`
Id string `json:id`
Method string `json:method`
Params []interface{} `json:params`
}
注意:json的字段首字母小写,在decode需要struct的变量首字母是大写的,所以要用tag标注出来。
如果还需要将BtcRpcRequest json.Marshal成json字符串,上面的结构需要改下,json后加上双引号
type BtcRpcRequest struct {
Jsonrpc string `json:"jsonrpc"`
Id string `json:"id"`
Method string `json:"method"`
Params []interface{} `json:"params"`
}
如果不要null的输出 ,加上omitempty option.
type BtcRpcRequest struct {
Jsonrpc string `json:"jsonrpc,omitempty"`
Id string `json:"id,omitempty"`
Method string `json:"method,omitempty"`
Params []interface{} `json:"params,omitempty"`
}
example:
package main
import (
"log"
"encoding/json"
"strings"
)
type BtcRpcRequest struct {
Jsonrpc string `json:"jsonrpc,omitempty"`
Id string `json:"id,omitempty"`
Method string `json:"method,omitempty"`
Params []interface{} `json:"params,omitempty"`
}
func main () {
dec := json.NewDecoder(strings.NewReader(string(`{"jsonrpc":"1.0","id":"curltext","method":"getblockchaininfo","params":[]}`)))
var m BtcRpcRequest
err := dec.Decode(&m)
if err != nil {
log.Fatal(err)
}
log.Println(m)
e, err := json.Marshal(&m)
if err != nil {
log.Fatal(err)
}
log.Println(string(e))
}
3、func (b BlockHeader) String() string { 。 String函数的object receiver不能用指针形式。