Golang中有一些变量:
var a int
func 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
}
在使用之前我应该初始化哪一个?
答案 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
变量声明创建一个或多个变量,绑定 相应的标识符,,并给每个类型和一个 初始值。
The initial value (zero value):
通过声明为变量分配存储空间时 或者通过a来调用new,或者创建新值时 复合文字或make的调用,没有明确的初始化 提供,变量或值被赋予默认值。每个元素 将此类变量或值设置为其类型的零值: {0}为布尔值,
0
为整数,0.0
为浮点数,""
为字符串, 和nil
用于指针,函数,接口,切片,通道和 地图。这种初始化是递归完成的,例如每个 如果没有值,则结构数组的元素将使其字段归零 已指定。
并查看func Unmarshal(data []byte, v interface{}) error
文档:
Unmarshal解析JSON编码的数据并将结果存储在 v。
指出的价值