簡體   English   中英

如何在Golang中的結構中訪問切片

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM