Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Exported and Unexported fields in Go Language

Tags:

go

I have a function in Go, the return value of which I hope to encode using gob. The return value is a struct pointer. However even though I do understand what exported variables are, I am not quite sure how to get it working.

Here is what my function is like

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
}

This is the error I get

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

I know why the error is occurring. But can someone help me solve it?

like image 538
Parag Avatar asked Oct 26 '16 07:10

Parag


People also ask

What are exported names in go?

In Go, a name is exported if it begins with a capital letter. For example, Pizza is an exported name, as is Pi , which is exported from the math package. pizza and pi do not start with a capital letter, so they are not exported.

What is Unexported field?

If a field or method name starts with a capital letter, the member is exported and is accessible outside of the package. If a field or method starts with a lowercase letter, the member is unexported and does not have accessibility outside of the package.


1 Answers

In go, fields and variables that start with an Uppercase letter are "Exported", and are visible to other packages. Fields that start with a lowercase letter are "unexported", and are only visible inside their own package.

The encoding/gob package depends on reflection to encode values, and can only see exported struct fields.

In order to make things encodable, capitalize the first letter of each field name in your stateNode struct that you want to be saved.

like image 138
captncraig Avatar answered Oct 14 '22 06:10

captncraig