Как мне создать объект структуры среза?

#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