[英]How to access a slice in struct in golang
如何訪問結構中定義的切片?
type Car struct {
Year int
Name string
Type []int
}
//按如下方式訪問“類型”數組字段會導致錯誤:數組超出范圍。
Car.Type[0] = 12
Car.Type[1] = 15
Car.Type[2] = 11
您將slice
誤認為是array
。 一定是:
type Car struct {
Year int
Name string
Type [3]int // <---
}
查看運行代碼
您應該閱讀此導覽: https : //tour.golang.org/moretypes/6
如果未初始化切片字段,則無法直接訪問它。 您定義的結構具有3個字段:類型為int的Year
,這是結構的一部分,是一個簡單的值。 Name
。 但是,“ Type
字段是一個切片。 切片是參考類型 。 這意味着它本質上是一個隱藏的結構(稱為切片標頭),具有指向為您動態分配的數組的基礎指針。 在初始化變量時,此基礎指針為nil
。
type Car struct {
Year int
Name string
Type []int
}
可以看作是:
type Car struct {
Year int
Name string
Type struct{
type: "int",
array *[]T
}
}
不完全是,但是您明白了。 當你寫:
c := Car{}
您只分配了int,string和slice 頭 。 因此,您必須首先初始化切片:
c := Car{
Year: 2018,
Name: "vroom",
Type: []int{
1, 2, 3,
},
}
當然,有很多初始化切片的方法。 您不必立即設置值,但是例如,您可以一次性分配和初始化所需的內存:
c.Type = make([]int, 3) // allocates an initialised 3 elements in the slice to 0
您還可以通過指定容量來分配但不初始化切片(這對於避免過多地重新分配和移動切片很有用):
c.Type = make([]int, 0, 3)
另外,您可以使用append讓運行時為您完成所有操作:
c.Type = append(c.Type, 1, 2, 3)
多一點背景。 從廣義上講,切片和地圖的工作方式相似。 因為它們是引用類型,它們在內部依賴於指針,所以具有切片作為返回類型的函數可能會返回nil
。 這對於返回int
函數不起作用:
func nilSlice() []int {
return nil
}
由於返回類型是切片,因此此函數將返回的內容實質上是一個空切片。 訪問它會導致發生相同的錯誤:索引超出范圍。
試圖從這樣的函數返回nil甚至不會編譯:
func nilInt() int {
nil
}
結果錯誤將顯示類似“不能將nil用作int類型”之類的信息 。 將切片視為指針類型:使用前需要對其進行安全初始化。 始終檢查它們的長度,如果需要優化,請查看如何實現內置的append
函數。 它只會成倍地增加基礎數組的容量。 您可能並不總是想要的東西。 優化這種東西很簡單
您混淆切片和數組。 切片就像動態數組。 定義切片的方式只有在附加切片后才定義它們的索引。 對於上面的代碼:
type Car struct {
Type []int
}
var car Car
car.Type = append(car.Type, 12)
car.Type = append(car.Type, 15)
car.Type = append(car.Type, 11)
另外,您的情況下的Car是一種對象類型 ,而不是對象本身。 我已經聲明了Car類型的對象car 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.