首页  >  文章  >  后端开发  >  你能在 Go 中创建不可变结构吗?

你能在 Go 中创建不可变结构吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-12 03:32:021012浏览

Can You Create Immutable Structs in Go?

Go 中的不可变结构体

问题: 在 Go 中创建一个不可变结构体是否可行,确保一旦初始化后,只能对其字段执行读操作而不修改其值?如果是这样,如何实现?

答案:

在 Go 中,结构体本质上是可变的。但是,可以通过采用某些技术使结构在其包之外只读。实现方法如下:

定义不可变结构:

定义具有非导出字段(以小写字母开头的字段)的结构。这可以防止从包外部直接访问字段。

package mypackage

type myReadOnly struct {
  value int
}

提供读取器函数:

创建可以访问结构体私有字段的读取器函数。这些函数将返回字段的副本,确保原始值保持不变。

func (s myReadOnly) Value() int {
  return s.value
}

初始化不可变结构:

创建一个初始化结构的函数并返回一个实例。此函数用于创建不可变结构的新实例。

func NewMyReadOnly(value int) myReadOnly{
  return myReadOnly{value: value}
}

用法:

要使用不可变结构,请导入包并使用以下命令创建实例初始化函数。使用读取器函数访问字段。

myReadOnly := mypackage.NewMyReadOnly(3)
fmt.Println(myReadOnly.Value()) // Prints 3

在此示例中,任何修改 myReadOnly 实例的 value 字段的尝试都将导致编译错误,因为该字段未导出。读取器函数 Value 提供了一种无需修改字段即可访问该字段的方法。这种方法有效地在 Go 中创建了一个不可变的结构。

以上是你能在 Go 中创建不可变结构吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn