Golang中有一些变量:
var a intfunc hello() { var a int }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 *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"`
}
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指向的值中.