第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

我應(yīng)該什么時(shí)候初始化 Golang 變量

我應(yīng)該什么時(shí)候初始化 Golang 變量

Go
SMILET 2022-03-03 15:07:58
Golang 中有一些變量:全局變量:var a int局部變量:func hello() { var a int }返回變量:func hello() (a int) {}Golang 有時(shí)會(huì)自動(dòng)初始化一些變量,但我不知道何時(shí)以及為什么?這讓我很困惑。例子: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}使用前我應(yīng)該初始化哪一個(gè)?
查看完整描述

2 回答

?
慕村9548890

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 指向的值中。


查看完整回答
反對(duì) 回復(fù) 2022-03-03
?
翻翻過(guò)去那場(chǎng)雪

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)致崩潰?


查看完整回答
反對(duì) 回復(fù) 2022-03-03
  • 2 回答
  • 0 關(guān)注
  • 265 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)