我什么时候应该初始化Golang变量

时间:2016-08-24 02:25:06

标签: variables go

Golang中有一些变量:

  1. 全局变量:var a int
  2. 本地变量:func hello() { var a int }
  3. 返回变量:func hello() (a int) {}
  4. Golang有时会自动初始化一些变量,
    但我不知道何时以及为何?它使我困惑。

    示例:

    type User struct {
      Name string `json:"name"`
      Age  int    `json:"age"`
    }
    
    func foo(bts []byte) {
      var a User
      err := json.Unmarshal(bts, &a)  // It's ok
    }
    
    func bar(bts []byte) (a *User) {
      err := json.Unmarshal(bts, a) // It will crash
    }
    

    在使用之前我应该​​初始化哪一个?

1 个答案:

答案 0 :(得分:8)

Golang将初始化所有变量(不是有时,而不是 some ):

在您的代码中:

a

你传递了一个nil指针但你需要a指向的值,而不是nil指针:
因此,您可以创建一个Value,然后将此值的地址存储在var a *User

使用func bar(bts []byte) (a *User)a时:
User是指向nil类型的指针,并将其初始化为零值,即package main import "fmt" func main() { var a *User fmt.Printf("%#v\n\n", a) } type User struct { Name string `json:"Name"` Age int `json:"Age"` }
见(The Go Playground):

(*main.User)(nil)

输出:

a = &User{}

您可以使用package main import ( "encoding/json" "fmt" ) func foo(bts []byte) (*User, error) { var a User err := json.Unmarshal(bts, &a) // It's ok return &a, err } func bar(bts []byte) (a *User, err error) { a = &User{} err = json.Unmarshal(bts, a) // It's ok return } func main() { str := `{ "Name": "Alex", "Age": 3 }` u, err := foo([]byte(str)) if err != nil { panic(err) } fmt.Printf("%#v\n\n", u) // &main.User{Name:"Alex", Age:3} u, err = bar([]byte(str)) if err != nil { panic(err) } fmt.Printf("%#v\n\n", u) // &main.User{Name:"Alex", Age:3} } type User struct { Name string `json:"Name"` Age int `json:"Age"` } 对其进行初始化,例如此工作代码(The Go Playground):

&main.User{Name:"Alex", Age:3}

&main.User{Name:"Alex", Age:3}

输出:

false

Variable declarations

  

变量声明创建一个或多个变量,绑定   相应的标识符,,并给每个类型和一个   初始值。

The initial value (zero value)

  

通过声明为变量分配存储空间时   或者通过a来调用new,或者创建新值时   复合文字或make的调用,没有明确的初始化   提供,变量或值被赋予默认值。每个元素   将此类变量或值设置为其类型的零值:   {0}为布尔值,0为整数,0.0为浮点数,""为字符串,   nil用于指针,函数,接口,切片,通道和   地图。这种初始化是递归完成的,例如每个   如果没有值,则结构数组的元素将使其字段归零   已指定。

并查看func Unmarshal(data []byte, v interface{}) error文档:

  

Unmarshal解析JSON编码的数据并将结果存储在   v。

指出的价值