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中文网其他相关文章!