Go语言 初始化结构中固定大小的数组

myzjeezk  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(82)

我想建立一个后进先出的堆栈。我已经创建了一个Stack[T any]接口和一个dynamicStack[T any]结构。dynamicStack具有数据[]T字段和索引int字段。当创建dynamicStack时,我希望数据初始化为空,大小固定为1,类型为T。出现语句:“无法使用[0]T{}([0]T类型的值)作为赋值中的[]T值”。

type Stack[T any] interface {
    IsEmpty() bool
    SeeTop() T
    AddToStack(T)
    Unstack() T
}
type dynamicStack[T any] struct {
    data    []T
    index int
}
func CreateDynamicStack[T any]() Stack[T] {
    s := new(dynamicStack[T])
    s.data = [0]T{} // Problem
    s.index = 0
    return s
}

我试过使用const而不是“0”,不同的大小,甚至将数组初始化为非空,但没有任何效果。
我不想使用append()方法,我需要一个固定大小的数组,因为我的计划是在数组满或半空时调整数组大小。
有什么想法吗?

yzuktlbb

yzuktlbb1#

s.data是一个slice,你应该将它初始化为一个slice:

s.data = make([]T, 0)

实际上,go处理nil切片的方式与处理空切片的方式非常相似,因此您甚至不需要在结构中初始化s.data。有关说明,请参见下面的示例。
在go中,切片类型[]T和数组类型[n]T之间存在差异。
有关切片和数组行为的详细解释,请参阅Andrew Gerrand的这篇文章:
Go Slices: usage and internals

// example of slice usage:
func testSlice() {
    var s []int

    fmt.Println("length:", len(s))
    for i, x := range s {
        fmt.Println("iterating:", i, x) // never executed, the slice is empty
    }

    newSlice := append(s, 1)  // a slice allocation happens here
    fmt.Println("result of append(s,1):", newSlice)

    emptySlice := make([]int, 0)

    // the only visible different thing is comparing to nil:
    if s == nil {
        fmt.Println("s is nil")
    }
    if emptySlice == nil {
        fmt.Println("emptySlice is nil") // not printed
    }

    // if you stick to checking the *length* of your slice, you will
    // have a consistent behavior:
    if len(s) == 0 {
        fmt.Println("s is empty")
    }
    if len(emptySlice) == 0 {
        fmt.Println("emptySlice is empty")
    }
}

Playground:https://go.dev/play/p/kB1g2Iq-n6u

相关问题