簡體   English   中英

在golang中初始化結構類型的空數組

[英]Initializing an empty array of struct type in golang

我已經初始化了一個結構:

type DayAndTime struct {
    days string
    time string
  }

我已經初始化了這個DayAndTime類型的空數組集:

day := []DayAndTime{}

並在其中輸入一個值: day[0] = DayAndTime{"Monday", "8.00 PM"}

但它顯示了一個運行時錯誤:

panic: runtime error: invalid memory address or nil pointer dereference

為什么會發生這種情況,可能的解決方案是什么?

編輯:它實際上是一個切片而不是一個數組。

這里你有一個零長度的切片, lencap函數都將為零值切片返回 0

切片不能超出其容量增長。 嘗試這樣做會導致運行時恐慌,就像在切片或數組的邊界之外進行索引時一樣。 同樣,切片不能在零以下重新切片以訪問數組中較早的元素。

您可以使用容量初始化切片並使用索引分配或使用附加向切片添加值

兩者都是有效代碼

var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})

var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}

推薦使用 append

這是一個證明/解釋答案的示例代碼https://play.golang.org/p/ajsli-6Vqw

package main

import (
    "fmt"
)

type DayAndTime struct {
    days string
    time string
}

func ZeroLength() {
    var day = []DayAndTime{}
    fmt.Println("Hello, playground", cap(day), len(day), day)
}

func AppendArray() {
    var day = []DayAndTime{}
    day = append(day, DayAndTime{"Monday", "8.00 PM"})
    fmt.Println("Hello, playground", cap(day), len(day), day)
}

func SetIndex() {
    var day = make([]DayAndTime, 1)
    day[0] = DayAndTime{"Monday", "8.00 PM"}
    fmt.Println("Hello, playground", cap(day), len(day), day)
}

func main() {
    ZeroLength()
    AppendArray()
    SetIndex()
}

如果您打印day的長度,您將獲得0 ,因此您無法訪問不存在的day[0]

你可以這樣寫: day = append(day, DayAndTime{"Monday", "8.00 PM"})

在您的示例中,這應該是正確的語法:

type DayAndTime struct {
    days string
    time string
}

days := []*DayAndTime{}

您要求為數組提供解決方案,但在您的代碼中顯示了一個切片。

foo := []string{}
t := reflect.TypeOf(foo)
fmt.Println(t.Kind()) // slice

bar := [2]string{}
tt := reflect.TypeOf(bar)
fmt.Println(tt.Kind()) // array

無論如何,......你得到了那個錯誤,因為 days[0] 超出了切片的范圍。 Thant 實際上包含零個項目,其長度為零。 您必須使用 append,返回新切片,然后才能訪問 days[0]。 或者可以用make初始化。

package main

import "fmt"

type DayAndTime struct {
    days string
    time string
}

func main() {
    days := []DayAndTime{}
    days = append(days, DayAndTime{"days ...", "time ..."})
    fmt.Printf("%v", days[0].days)
}

另一種解決方案是構建一個數組而不是切片

func main() {
    days := [2]DayAndTime{}
    days[0].days = "fooo"
    fmt.Printf("%v", days[0].days)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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