英文:
How do I construct an object of a slice struct?
问题
package main
import (
"fmt"
)
type demo struct {
Text string
Type string
}
func main() {
d := demo{
Text: "Hello",
Type: "string",
}
fmt.Println(d)
}
在这段代码中,我在声明demo
结构体的对象时遇到了一个错误:
./prog.go:11:3: undefined: Text
./prog.go:11:9: cannot use "Hello" (untyped string constant) as struct{Text string; Type string} value in array or slice literal
./prog.go:12:3: undefined: Type
./prog.go:12:9: cannot use "string" (untyped string constant) as struct{Text string; Type string} value in array or slice literal
这是因为这不是一个普通的结构体声明,所以请告诉我如何构造demo
结构体的对象?
英文:
package main
import (
"fmt"
)
type demo []struct {
Text string
Type string
}
func main() {
d := demo{
Text: "Hello",
Type: "string",
}
}
In this code I'm getting an error while declaring the object of demo
struct:
> ./prog.go:11:3: undefined: Text<br>
> ./prog.go:11:9: cannot use "Hello" (untyped string constant) as struct{Text string; Type string} value in array or slice literal<br>
./prog.go:12:3: undefined: Type<br>
./prog.go:12:9: cannot use "string" (untyped string constant) as struct{Text string; Type string} value in array or slice literal
it's obvious because it is not a normal struct declaration so please help me how can I construct object of demo
struct?
答案1
得分: 1
由于您将demo
声明为一个匿名结构体的切片,因此您必须使用demo{}
来构造切片,并使用{Text: "Hello", Type: "string"}
来构造项目。
func main() {
d := demo{{
Text: "Hello",
Type: "Anon",
}}
fmt.Println(d)
// [{Hello Anon}]
}
作为一个切片,您也可以使用make
来创建它,但是添加项目需要复制匿名结构体的定义:
func main() {
d1 := make(demo, 0)
d1 = append(d1, struct {
Text string
Type string
}{"Hello", "Append"})
fmt.Println(d1)
// [{Hello Append}]
}
然而,尽管它可以编译,但这是相当不常见的。只需定义命名的结构体类型,然后将d
定义为这些结构体的切片。语法几乎相同,但更直观:
// 只需定义结构体类型
type demo struct {
Text string
Type string
}
func main() {
d2 := []demo{{
Text: "Hello",
Type: "Slice",
}}
fmt.Println(d2)
// [{Hello Slice}]
}
Playground: https://go.dev/play/p/4kSXqYKEhst
英文:
Since you declared demo
as a slice of anonymous structs, you have to use demo{}
to construct the slice and {Text: "Hello", Type: "string"}
to construct the item(s).
func main() {
d := demo{{
Text: "Hello",
Type: "Anon",
}}
fmt.Println(d)
// [{Hello Anon}]
}
Being a slice, you can also make
it, but then appending items requires replicating the definition of the anonymous struct:
func main()
d1 := make(demo, 0)
d1 = append(d1, struct {
Text string
Type string
}{"Hello", "Append"})
fmt.Println(d1)
// [{Hello Append}]
}
However albeit it compiles, it is rather uncommon. Just define the named struct type, and then d
as a slice of those. The syntax is almost the same, but straightforward:
// just defined struct type
type demo struct {
Text string
Type string
}
func main() {
d2 := []demo{{
Text: "Hello",
Type: "Slice",
}}
fmt.Println(d2)
// [{Hello Slice}]
}
Playground: https://go.dev/play/p/4kSXqYKEhst
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论