结构声明中的文字值

Literal value in struct declaration

假设我们有这样一个结构:

type Foo struct {
  one string
  two int
}

是否可以为此声明文字值,例如:

type Foo struct {
  one "foobar"
  two int
}

type Foo struct {
  one string
  two 5678
}

基本上对于某些对象,我们可能有一个字段的硬编码值。

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>() 的函数。此函数 returns 一个新对象,每个定义的字段都有默认值。


值得注意的例外,对于从匿名结构创建的对象,可以在声明时指定字段的默认值。即

obj := struct {
    one string
    two int
}{
    "default value for one",
    2,
}

不,Go 不支持文字类型(a la TypeScript)。而且,它实际上不能,因为零值

每个类型都有一个零值总是存在并且总是可以分配给它.当声明一个类型的变量时,它们被隐式分配给它们类型的零值。

  • 对于整数(intuintint32uint32int64uin64)或float (float32, float64) 或 complex (complex64 or complex128) 类型,这只是 0 (分别为 0.0)。

  • 对于字符串类型,这是空字符串""

  • 对于切片、映射、指针、通道和接口,零值为nil

  • 对于数组(不是切片:数组是具有静态已知长度的值类型);它们的零值只是重复填充每个槽的元素类型的零值

  • struct类型的零值是一个所有字段都是零值的结构

在任何情况下,因为任何类型总是可能有零值,所以创建一个只允许任何特定非零值的类型是不兼容的。

最好的文字类型 "foo" 可能表示的是值是 "foo" 或零值 "" (不,Go 无论如何都不支持这个) .

您最接近的是 constant 声明,或者恰好 [=7​​0=] 固定值而不是实际字段的接收函数。