#go
#Вперед #структура #нарезать #литералы
Вопрос:
package main
import (
"fmt"
)
type demo []struct {
Text string
Type string
}
func main() {
d := demo{
Text: "Hello",
Type: "string",
}
}
В этом коде я получаю сообщение об ошибке при объявлении объекта demo
struct:
./prog.go:11:3: неопределенный: Текст
./prog.go:11:9: невозможно использовать «Hello» (нетипизированную строковую константу) в качестве значения struct{Текстовая строка; Введите строку} в массиве или литерале среза
./prog.go:12:3: неопределенный:Type
./prog.go:12:9: невозможно использовать «string» (нетипизированную строковую константу) в качестве struct{Текстовая строка; Введите string} значение в массиве или литерале среза
это очевидно, потому что это не обычное объявление структуры, поэтому, пожалуйста, помогите мне, как я могу создать объект demo
структуры?
Комментарии:
1. Это потому, что ваш тип представляет собой срез структур, но вы создаете
d
как единую структуру. Вы хотитеdemo
, чтобы тип был одной структурой или их частью?2. Не используйте срез анонимных структур в качестве типа, просто объявите нужную структуру и создайте срез, если он вам нужен.
Ответ №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
как часть из них. Синтаксис почти тот же, но простой:
// just defined struct type
type demo struct {
Text string
Type string
}
func main() {
d2 := []demo{{
Text: "Hello",
Type: "Slice",
}}
fmt.Println(d2)
// [{Hello Slice}]
}
Детская площадка: https://go.dev/play/p/4kSXqYKEhst