在golang中初始化一个空类型的struct类型

Sou*_*uth 6 arrays struct go

我初始化了一个结构:

type DayAndTime struct {
    days string
    time string
  }
Run Code Online (Sandbox Code Playgroud)

我已经初始化了一个这种DayAndTime类型的空数组:

day := []DayAndTime{}
Run Code Online (Sandbox Code Playgroud)

并在其中加入一个值: day[0] = DayAndTime{"Monday", "8.00 PM"}

但它显示运行时错误:

panic: runtime error: invalid memory address or nil pointer dereference
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?什么是可能的解决方案?

编辑:它实际上是一个切片而不是一个数组.

Sar*_*lai 12

这里有一个零长度切片,len并且cap函数将为零值切片返回0

切片不能超出其容量.尝试这样做会导致运行时出现混乱,就像在切片或数组的边界之外进行索引一样.类似地,切片不能在零以下重新切片以访问数组中的早期元素.

您可以使用容量初始化切片并使用索引进行分配或使用append将值添加到切片

两者都是有效的代码

var day []DayAndTime
day = append(day, DayAndTime{"Monday", "8.00 PM"})
Run Code Online (Sandbox Code Playgroud)

要么

var day = make([]DayAndTime, 1)
day[0] = DayAndTime{"Monday", "8.00 PM"}
Run Code Online (Sandbox Code Playgroud)

推荐使用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()
}
Run Code Online (Sandbox Code Playgroud)

  • `day := []DayAndTime{}` --- 但这里不是 `nil` 。 (2认同)