2 回答

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

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