Литеральное значение в объявлении структуры - PullRequest
0 голосов
/ 16 ноября 2018

Скажем, у нас есть такая структура:

type Foo struct {
  one string
  two int
}

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

type Foo struct {
  one "foobar"
  two int
}

или

type Foo struct {
  one string
  two 5678
}

в основном для некоторых объектов у нас может быть жестко закодированное значение для поля.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Нет, Go не поддерживает литеральные типы (а-ля TypeScript). Более того, на самом деле не может из-за нулевых значений .

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

  • Для целых чисел (int, uint, int32, uint32, int64, uin64) или с плавающей запятой (float32, float64) или сложных (complex64 или complex128), это просто 0 (0.0 соответственно).

  • Для строковых типов это пустая строка "".

  • Для срезов, карт, указателей, каналов и интерфейсов нулевое значение равно nil.

  • Для массивов (не слайсов: массивы являются типами значений со статически известной длиной); их нулевое значение - это просто нулевое значение типа элемента, повторяемое для заполнения каждого слота

  • Нулевым значением типа структуры является структура, все поля которой имеют нулевые значения

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

Лучшее значение, которое может представлять буквальный тип "foo", - это то, что значение равно либо "foo", либо нулевое значение "" (и нет, Go в любом случае не поддерживает это).

Самое близкое, что вы сможете сделать - это объявление муравья const или функция-получатель, которая, как правило, возвращает фиксированное значение вместо фактического поля.

0 голосов
/ 16 ноября 2018

Go - это статически типизированный язык, означающий, что каждая переменная должна быть объявлена ​​с определенным типом данных.

Установка значения по умолчанию для каждого поля внутри структуры в объявлении невозможна в Go.это не поддерживается.

Но, может быть, вы можете сделать что-то вроде этого.

type Foo struct {
    one string
    two int
}

func NewFoo() *Foo {
    foo := new(Foo)
    foo.one = "default value for one"
    foo.two = 2
    return foo
}

func main() {
    objectWithDefaultValueForItsField := NewFoo()
}

То, что я сделал, в основном, просто создал функцию с именемNew<struct name>().Эта функция возвращает новый объект со значением по умолчанию для каждого из определенных полей.


Заметное исключение: для объекта, созданного из анонимной структуры, значение по умолчанию полей может быть указано в объявлении.то есть

obj := struct {
    one string
    two int
}{
    "default value for one",
    2,
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...