5 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個贊
如果你定義No為整數(shù),那么如果它沒有被賦值,golang 會將它設(shè)置為0(默認(rèn)值),這有時會根據(jù)你使用它的目的而造成混淆(例如,if0是 的有效值No)。
如果你真的想檢查是否Student.No已分配。我認(rèn)為最好使用Pointer。
type Student struct{
? ? Name string
? ? No *int
}
student:= Student{
? ? Name:"Lily",
}
if student.No == nil {
? ? fmt.Println("student.No is not defined")
}
student2 := Student{
? ? Name: "Bob",
? ? No: func(i int) *int{ return &i}(5),
}
if student2.No != nil {
? ? fmt.Printf("student.No is %d\n", *student2.No)
}

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
您將變量定義為指針變量
type Student struct{
Name string
No *int
}
student:=Student{
Name:"Lily",
}
在這種情況下,如果你這樣做
if student.No==nil{
fmt.Println("Yes I'm unassigned")
}
它會打印
Yes I'm unassigned
我們可以在解組 json 時使用這種技術(shù),以查明是否提供了一個字段,以及在掃描可為 null 的值表單數(shù)據(jù)庫時。要取回價值,您必須使用
*student.NO

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超21個贊
該字段將具有該數(shù)據(jù)類型的零值。在本例中為 0。您的支票將如下所示:
student.No == 0
起初這看起來有點(diǎn)奇怪。但在這種情況下,0
作為數(shù)字的 a 作為有效的學(xué)生編號沒有意義。

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超4個贊
Go 中的每種數(shù)據(jù)類型都有自己的“零值”。所以,在No
(?number
) 的情況下,它是0
.?您可以檢查 的值是否No
為0
。

TA貢獻(xiàn)1873條經(jīng)驗(yàn) 獲得超9個贊
如果不手動比較結(jié)構(gòu)的每個字段,就沒有其他方法可以檢查是否設(shè)置了某個值。
這就是為什么在stdlib許多包中都有方法的原因New...。
例如bufio.NewWriter(),包的作者負(fù)責(zé)根據(jù)自己的用例使用一些合理的默認(rèn)值初始化結(jié)構(gòu)。
// NewStudent returns new Student instance
func NewStudent() *Student {
return &Student{Name: "defaultName", No: 7}
}
即使Student導(dǎo)出類型,您的包用戶也應(yīng)該New...使用任何結(jié)構(gòu)。
還有另一種方法可以解決這個問題,但對于許多程序來說可能過于復(fù)雜,但您可以在此處和此處閱讀有關(guān)它們的信息。
- 5 回答
- 0 關(guān)注
- 187 瀏覽
添加回答
舉報