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

All*_*vey 2 variables go

Golang中有一些变量:

  1. 全局变量: var a int
  2. 局部变量: func hello() { var a int }
  3. 返回变量: func hello() (a int) {}

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
}
Run Code Online (Sandbox Code Playgroud)

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

小智 9

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

在你的代码中:

func bar(bts []byte) (a *User) {
  err := json.Unmarshal(bts, a) // It will crash
}
Run Code Online (Sandbox Code Playgroud)

你传递了一个nil指针但你需要一个指向的值a,而不是一个nil指针:
所以你可以创建一个Value然后将这个Value的地址存储在里面a:


当您使用var a *Userfunc 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"`
}
Run Code Online (Sandbox Code Playgroud)

输出:

(*main.User)(nil)
Run Code Online (Sandbox Code Playgroud)

您可以使用a = &User{}它来初始化它,就像这个工作代码(The Go Playground):

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"`
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

&main.User{Name:"Alex", Age:3}
Run Code Online (Sandbox Code Playgroud)

变量声明:

变量声明创建一个或多个变量,将相应的标识符绑定到它们,并为每个变量赋予类型和初始值.

初始值(零值):

当通过声明或调用new为变量分配存储时,或者通过复合文字或make调用创建新值时,并且不提供显式初始化,则给出变量或值默认值.这样的变量或值的每个元素被设置为它的类型的零值: false为布尔型,0为整数,0.0为浮点数,""字符串, nil用于指针,功能,接口,切片,通道,和地图.这种初始化是递归完成的,因此,例如,如果没有指定值,则结构数组的每个元素都将其字段归零.

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

Unmarshal解析JSON编码的数据并将结果存储在v指向的值中.