Go语言中的导出和未导出字段

时间:2016-10-26 07:26:16

标签: go

我在Go中有一个函数,我希望使用gob编码的返回值。返回值是结构指针。然而,即使我确实了解导出的变量是什么,我也不太确定如何使其工作。

这就是我的功能

fun loadXYZ(root *structABC) *structABC{
    const once = "stateData.bin"
    rd, errr := ioutil.ReadFile(once)
    if errr!=nil{

        //Do some computation and store in "root"

        buf := &bytes.Buffer{}
        errr = gob.NewEncoder(buf).Encode(root)
        if errr != nil {
            panic(errr)
        }
        errr = ioutil.WriteFile(once, buf.Bytes(), 0666)
        if errr != nil {
            panic(errr)
        }
        return root
    }
    var d *structABC
    errr = gob.NewDecoder(bytes.NewReader(rd)).Decode(&d)
    if errr != nil {
         panic(errr)
    }
    return d
}

这是我得到的错误

panic: gob: type main.stateNode has no exported fields

我知道错误发生的原因。但有人可以帮我解决吗?

2 个答案:

答案 0 :(得分:8)

在go中,以大写字母开头的字段和变量是“已导出”,并且对其他包可见。以小写字母开头的字段是“未导出的”,只能在自己的包中显示。

encoding / gob包依赖于反射来编码值,并且只能看到导出的结构域。

为了使事物可编码,请将stateNode结构中每个字段名称的第一个字母大写,以便保存。

答案 1 :(得分:5)

导出字段这是一个名称以大写字母开头的字段,如:

type stateNode struct {
    ImExported string // Exported
    butImNot string // unexported
}