2 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個贊
Golang 將初始化所有變量(不是有時,不是一些):
在您的代碼中:
func bar(bts []byte) (a *User) {
err := json.Unmarshal(bts, a) // It will crash
}
您傳遞了一個 nil 指針,但您需要一個由 指向的值a,而不是一個 nil 指針:
因此您可以創(chuàng)建一個 Value 然后將這個 Value 的地址存儲在里面a:
當(dāng)您使用var a *Useror時func bar(bts []byte) (a *User):
Thea是指向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) // 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"`
}
輸出:
&main.User{Name:"Alex", Age:3}
&main.User{Name:"Alex", Age:3}
變量聲明:
變量聲明創(chuàng)建一個或多個變量,將相應(yīng)的標(biāo)識符綁定到它們,并給每個變量一個類型和一個初始值。
初始值(零值):
當(dāng)通過聲明或調(diào)用為變量分配存儲空間new時new,或者通過復(fù)合文字或調(diào)用創(chuàng)建值時make,并且未提供顯式初始化,則為變量或值賦予默認(rèn)值. 此類變量或值的每個元素都針對其類型設(shè)置為零值: false對于布爾值、0整數(shù)、0.0浮點(diǎn)數(shù)、""字符串 以及nil指針、函數(shù)、接口、切片、通道和映射。這種初始化是遞歸完成的,例如,如果沒有指定值,結(jié)構(gòu)數(shù)組的每個元素都將其字段歸零。
并查看func Unmarshal(data []byte, v interface{}) error文檔:
Unmarshal 解析 JSON 編碼的數(shù)據(jù)并將結(jié)果存儲在 v 指向的值中。

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個贊
Go 是一種非常一致的語言:它總是自動初始化變量:
通過引用表達(dá)式中的變量來檢索變量的值;它是分配給變量的最新值。如果一個變量還沒有被賦值,它的值是它的類型的零值。
0
對于數(shù)字類型,
false
對于布爾類型,和
""
(空字符串)用于字符串。
對于映射、切片、指針和接口,零值是nil
.
對于自定義類型,以某種方式使零值有用是慣用的(即通常被認(rèn)為是最佳實(shí)踐),通常作為默認(rèn)值或重要的標(biāo)記。
編輯:您的示例不會崩潰。也許您從中刪除的其中一件事是導(dǎo)致崩潰?
- 2 回答
- 0 關(guān)注
- 252 瀏覽
添加回答
舉報