Go语言:在结构体中声明一个切片?

8fq7wneg  于 2022-12-16  发布在  Go
关注(0)|答案(3)|浏览(120)

下面的代码:

type room struct {
    width float32
    length float32
}
type house struct{
    s := make([]string, 3)
    name string
    roomSzSlice := make([]room, 3)
} 

func main() {

}

当我尝试构建和运行它时,我得到了以下错误:

c:\go\src\test\main.go:10: syntax error: unexpected :=
c:\go\src\test\main.go:11: non-declaration statement outside function body
c:\go\src\test\main.go:12: non-declaration statement outside function body
c:\go\src\test\main.go:13: syntax error: unexpected }

我做错什么了?
谢谢!

v1uwarro

v1uwarro1#

你可以在struct声明中声明一个slice,但是你不能初始化它,你必须用不同的方法来完成。

// Keep in mind that lowercase identifiers are
// not exported and hence are inaccessible
type House struct {
    s []string
    name string
    rooms []room
}

// So you need accessors or getters as below, for example
func(h *House) Rooms()[]room{
    return h.rooms
}

// Since your fields are inaccessible, 
// you need to create a "constructor"
func NewHouse(name string) *House{
    return &House{
        name: name,
        s: make([]string, 3),
        rooms: make([]room, 3),
    }
}

请将以上内容视为**runnable example on Go Playground**

编辑

要按照注解中的要求部分初始化结构体,只需更改

func NewHouse(name string) *House{
    return &House{
        name: name,
    }
}

请再次将以上内容视为**runnable example on Go Playground**

n3schb8v

n3schb8v2#

首先,你不能在结构内部赋值/初始化。:=操作符声明和赋值。然而,你可以简单地实现相同的结果。
下面是一个简单的例子,它大致可以完成您正在尝试的工作:

type house struct {
    s []string
}

func main() {
    h := house{}
    a := make([]string, 3)
    h.s = a
}

我从来没有这样写过,但如果它服务于你的目的...它编译无论如何。

ryevplcw

ryevplcw3#

您还可以参考以下内容:https://golangbyexample.com/struct-slice-field-go/

type student struct {
    name   string 
    rollNo int    
    city   string 
}

type class struct {
    className string
    students  []student
}

goerge := student{"Goerge", 35, "Newyork"}
john := student{"Goerge", 25, "London"}

students := []student{goerge, john}

class := class{"firstA", []student{goerge, john}}

相关问题