Прошу прощения за этот простой вопрос, у меня есть следующий код

// package p
package p
// U type 
type U struct {
    A, B int
    c    int
} // A and B are exported only
// main
package main

import (
    "fmt"
    "./p"
)

func main() {
    pp := p.U{A: 3, B: 4}
    uu := p.U{3, 5}    // the error resulted from this line
    fmt.Println(pp)
    fmt.Println(uu)
}

При попытке скомпилировать я получаю сообщение об ошибке: слишком мало значений в буквальном значении p.U . Я ожидаю, что нет необходимости добавлять значение c. когда я пытаюсь добавить значение c, я получаю еще одну ожидаемую ошибку: неявное присвоение неэкспортированного поля 'c' в литерале p.U

go
-1
kerbrose 1 Сен 2020 в 06:46

2 ответа

Лучший ответ

В golang есть два способа создать экземпляр структуры: с ключами и без ключей.

При создании экземпляра с ключами вы должны написать значение каждого имени поля рядом с именем поля следующим образом:


type Employee struct {

name string
age int
boss bool

}

employee := Employee{name: "John", age: 30}

При создании экземпляра без ключей вы просто пишете значение каждого поля без написания таких имен полей:

type Employee struct{

name string
age int
boss bool

}

employee := Employee{"John", 30, false}

Как вы могли заметить, при создании экземпляра с ключами вам не нужно указывать значение для каждого поля (вам не нужно включать значение для босса). Это потому, что, поскольку вы даете значения только определенным полям, golang может принимать значения для других полей.

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

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

1
JUAN FELIPE SUÁREZ BURGOS 1 Сен 2020 в 05:01

При создании структурного литерала вы должны помнить о следующих правилах:

  1. Ключ должен быть именем поля, объявленным в типе структуры.
  2. В списке элементов, не содержащем ключей, должен быть указан элемент для каждого поля структуры в том порядке, в котором эти поля объявлены.
  3. Список элементов, содержащий ключи, не обязательно должен иметь элемент для каждого поля структуры. Пропущенные поля получают для этого поля нулевое значение.
  4. Литерал может опускать список элементов; такой литерал оценивается как нулевое значение для своего типа.
  5. Ошибочно указывать элемент для неэкспортируемого поля структуры, принадлежащей другому пакету.
2
ulyC 1 Сен 2020 в 05:19