亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

go中的[]int{}和[]int有什么區別?

go中的[]int{}和[]int有什么區別?

Go
蕭十郎 2023-08-14 15:07:22
go里有兩種不同的定義,但是有什么區別呢?我已經嘗試過以下方法:func main() {    var test1 []int    test2 := []int{}    if test1 == nil {        fmt.Println(1)    }    if test2 == nil {        fmt.Println(2)    }    fmt.Println("test1:", test1)    fmt.Println("test2:", test2)}這是輸出:1test1: []test2: []但為什么 test1 是 nil 而另一個不是呢?
查看完整描述

2 回答

?
元芳怎么了

TA貢獻1798條經驗 獲得超7個贊

就其本身而言,是 的類型切片的[]int拼寫。int

在:

var?test1?[]int

提供[]int變量的類型test1。該行作為一個整體不提供任何值,因此test1被初始化為type 的零值[]int。它的零值是[]int(nil),或者非正式地,就是 nil 。1

在:

test2?:=?[]int{}

提供[]int大括號括起來的初始值設定項列表的類型。也就是說,{}是一個復合文字:一個左大括號,后跟一個元素列表(在本例中為空),后跟一個右大括號。該行的其余部分(:=左側的 和變量名稱)表示一個簡短的變量聲明。這為變量提供了類型test2,以及空列表生成的值。?[]int

在這種情況下,空列表生成的值是 的一個空切片int: 1 具有空的2后備存儲,長度為零,容量為零。

這就是為什么test1is nil 但test2不是:test1保存零值,對于任何切片類型來說,都是nilnil無論如何轉換為該類型之后)。同時test2保存由三部分組成的切片頭,該頭覆蓋由復合文字創建的零長度支持數組。

一個 nil 切片——這是一個有點草率的措辭:它意味著一個 slice-of 類型的值,T其實際值[]T(nil)而不是某些由三部分組成的切片頭——通??梢?em>用作相同類型。特別是,for i := range x兩者x = append(x, newElement)都處理得x == nil“很好”:它們對待它的方式與對待空切片的方式相同。打印切片的例程fmt也執行此操作。3


1nil本身是無類型的。nil請參閱 Go 規范中變量部分下第一次提到的。

2至少在沒有使用或類似的情況下,不可能判斷unsafe.PointerGo 是否實際為后備數組分配了任何存儲空間。您對切片執行的任何操作都可以為其提供一些容量,以便您可以將一些值放入內存中的某個位置,都將或可能只是分配一個新的后備數組。該包有一些unsafe用于查看 Go 運行時的技巧,但一般來說,您不需要也不應該這樣做。

3相比之下,map類型的表現就沒那么好了。如果x是(非正式地說)一個可能為零的切片,并且m是一個可能為零的映射,我們可以這樣做:

x?=?append(x,?newElem)

但我們不能這樣做:

m[key]?=?newElem

我們必須首先檢查是否m為 nil,如果是,則分配一個空映射:

if?m?==?nil?{
????m?=?make(...)?//?put?in?the?right?type?here
????}
m[key]?=?newElem

所以比較常用的是:

var?x?[]T
m?:=?map[string]T{}

就在彼此旁邊,因為x會表現得很好,也m不會表現得很好。


查看完整回答
反對 回復 2023-08-14
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

這是 nil 和空切片之間的區別。在golang中,如果你聲明一個沒有值的變量,它的值將成為該變量類型的零值。數組的零值為 nil。不是空切片??梢允褂?make 函數或 Shorty 用于 test2 的第二種方法來生成空切片



查看完整回答
反對 回復 2023-08-14
  • 2 回答
  • 0 關注
  • 345 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號