Что {} в назначении? - PullRequest
       0

Что {} в назначении?

0 голосов
/ 13 апреля 2020

В Go при присвоении множества значений массиву используются фигурные скобки {....} . Что это за брекеты? Это анонимная структура?

package main

import "fmt"

func main() {
    var string_array [4]string = [4]string {"X", "Y", "Z", "W"}
    var int_array [5]int = [5]int {1,2,3}

    fmt.Println(string_array)
    fmt.Println(int_array)
}

{"X", "Y", "Z", "W"} - это то же самое, что и ниже, а Go во время выполнения выполняет неявное преобразование?

    type anonymous struct {
        _0 string
        _1 string
        _2 string
        _3 string
    }
    var anon anonymous = anonymous{"X", "Y", "Z", "W"}

Почему бы не использовать ["X", "Y", "Z", "W"], если оно такое массив?

Где в спецификации Golang объяснен этот синтаксис?

1 Ответ

5 голосов
/ 13 апреля 2020

Это задокументировано в спецификации языка Go в разделе " Составные литералы " (выделено):

Составные литералы создают значения для структур, массивы, срезы и карты и создавать новое значение каждый раз, когда они оцениваются. Они состоят из типа литерала , за которым следует список элементов в скобках . Каждому элементу необязательно может предшествовать соответствующий ключ.

Где «скобка» относится к значениям, ограниченным { и } согласно вашему опубликованному коду.

Из грамматики spe c:

CompositeLit  = LiteralType LiteralValue .
LiteralType   = StructType | ArrayType | "[" "..." "]" ElementType |
                SliceType | MapType | TypeName .
LiteralValue  = "{" [ ElementList [ "," ] ] "}" .        <-- This production-rule, right here
ElementList   = KeyedElement { "," KeyedElement } .
KeyedElement  = [ Key ":" ] Element .
Key           = FieldName | Expression | LiteralValue .
FieldName     = identifier .
Element       = Expression | LiteralValue .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...