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

时间:2017-09-17 07:04:00

标签: arrays go struct

我初始化了一个结构:

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

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

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

4 个答案:

答案 0 :(得分:8)

这里有一个零长度切片,lencap函数都将为零值切片返回0

  

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

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

两者都是有效的代码

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

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

建议使用追加

以下是验证/解释答案的示例代码 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()
}

答案 1 :(得分:0)

如果您打印day的长度,您将获得 0 ,因此您无法访问不存在的day[0]

您可以这样写:day = append(day, DayAndTime{"Monday", "8.00 PM"})

答案 2 :(得分:0)

这在您的示例中应该是正确的语法:

type DayAndTime struct {
    days string
    time string
}

days := []*DayAndTime{}

答案 3 :(得分:-1)

您要求为数组提供解决方案,但在代码中显示切片。

let days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

let result = days.reduce((r,a)=>r.concat(a.charAt(0).toLocaleUpperCase()+a.slice(1)),[]);

console.log(result)

无论如何,......你得到了那个错误,因为天[0]超出了切片的范围。 Thant实际上包含零项,其长度为零。您必须使用append,返回新切片,然后您可以访问days [0]。或者可以使用make初始化。

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

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

另一个解决方案是构建一个数组而不是切片

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)
}