Go 中的映射值不可寻址
在 Go 中,映射值无法像 C 中那样直接寻址。当尝试获取地图中条目的地址时,这一点变得很明显。考虑下面的代码:
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" var myptr *string = &mymap[1] fmt.Println(*myptr) // Generates error }
此代码会触发错误,指出“无法获取地图值的地址”。但是,如果在获取其地址之前使用中间字符串变量来存储值,则代码运行不会出现问题:
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" mystring := mymap[1] var myptr *string = &mystring fmt.Println(*myptr) // Works }
为什么映射值不可寻址?
禁止直接寻址map值源于Go中map的内部实现。最有可能的是,它们被实现为一种哈希表。哈希表的动态特性允许插入和删除,可能会使现有条目的地址无效。
为了防止此类错误,Go 阻止了映射值的可寻址性。这确保了如果基础哈希表被重新组织,检索到的值仍然有效。
间接寻址值
虽然不允许直接寻址映射值,但可以间接寻址允许。这意味着变量可以保存映射条目的值,而不能直接修改该值。考虑以下示例:
var mystring string = mymap[1] // Indirect addressing
这一行将 mymap 中键为 1 的条目的值分配给 mystring。对 mymap 的更改将反映在 mystring 中。然而,mystring 是不可变的,尝试修改它的值会导致错误。
结论
Go 中映射值的不可寻址性是一种设计选择旨在确保从映射检索的值保持有效,即使底层数据结构被重新组织。此限制可防止在保存映射条目的地址并随后修改映射时可能发生的错误。虽然它可能无法提供与其他一些编程语言相同的灵活性,但它有助于 Go 映射实现的稳定性和可预测性。
以上是为什么我不能直接在 Go 中寻址映射值?的详细内容。更多信息请关注PHP中文网其他相关文章!