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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

Go
SMILET 2022-03-03 15:07:58
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}使用前我應(yīng)該初始化哪一個?
查看完整描述

2 回答

?
慕村9548890

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


查看完整回答
反對 回復(fù) 2022-03-03
?
翻翻過去那場雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個贊

Go 是一種非常一致的語言:總是自動初始化變量:

通過引用表達(dá)式中的變量來檢索變量的值;它是分配給變量的最新值。如果一個變量還沒有被賦值,它的值是它的類型的零值。

零值為:

0對于數(shù)字類型,

false對于布爾類型,和

""(空字符串)用于字符串。

對于映射、切片、指針和接口,零值是nil.

對于自定義類型,以某種方式使零值有用是慣用的(即通常被認(rèn)為是最佳實(shí)踐),通常作為默認(rèn)值或重要的標(biāo)記。


編輯:您的示例不會崩潰。也許您從中刪除的其中一件事是導(dǎo)致崩潰?


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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