Golang会初始化所有变量(不是“有时”,也不是“一些”):
在您的代码中:
func bar(bts []byte) (a *User) {
err := json.Unmarshal(bts, a)
}
您传递了一个空指针,但您需要一个由
a
指向的值,而不是一个空指针:
因此,您可以创建一个值,然后将该值的地址存储在
a
中:
当你使用
var a *User
或
func bar(bts []byte) (a *User)
时:
a
是指向
User
类型的指针,并且它被初始化为其零值,即
nil
,参见(
The Go Playground):
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"`
}
输出:
(*main.User)(nil)
你可以使用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)
return &a, err
}
func bar(bts []byte) (a *User, err error) {
a = &User{}
err = json.Unmarshal(bts, a)
return
}
func main() {
str := `{ "Name": "Alex", "Age": 3 }`
u, err := foo([]byte(str))
if err != nil {
panic(err)
}
fmt.Printf("%#v\n\n", u)
u, err = bar([]byte(str))
if err != nil {
panic(err)
}
fmt.Printf("%#v\n\n", u)
}
type User struct {
Name string `json:"Name"`
Age int `json:"Age"`
}
输出:
&main.User{Name:"Alex", Age:3}
&main.User{Name:"Alex", Age:3}
变量声明:
变量声明创建一个或多个变量,将相应的标识符绑定到它们上面,并为每个变量指定类型和初始值。
初始值(零值):
当为变量分配存储空间时,可以通过声明或调用
new
,或创建一个新值(例如使用组合字面量或调用
make
)进行分配。如果没有提供明确的初始化,则该变量或值将被赋予默认值。这样变量或值的每个元素都会设置为其类型的零值:
false
表示布尔值,
0
表示整数,
0.0
表示浮点数,
""
表示字符串,
而指针、函数、接口、切片、通道和映射等则会被设置为nil
。此初始化是递归完成的,因此,如果未指定值,则结构体数组的每个元素的字段都将被清零。
请参阅
func Unmarshal(data []byte, v interface{}) error
文档:
解组(Unmarshal)函数可以解析JSON编码的数据,并将结果存储在指向v的值中。