回答

收藏

如何在 Go 中存储对操作结果的引用?

技术问答 技术问答 250 人阅读 | 0 人回复 | 2023-09-12

很难用语言来描述它,但假设我有一个存储器int指针映射,并希望将操作结果存储为散列中的另一个键:
) X. k" z1 B- ?. t$ V& @( C
    m := make(map[string]*int)m["d"] = &(*m["x"]   *m["y"])
    4 H6 `4 [" U7 P  N' ~
这不起作用,给了我错误: cannot take the address of *m["x"] & *m["y"], G4 d; d0 O# @2 b
                                                               
/ R5 M) x: g9 U5 N; a' q& J    解决方案:                                                                $ W7 k$ w( k: {2 A; ]
                                                                指针是内存地址。例如,变量在内存中有地址。
; A7 P1 i. b$ a) J) _: b3   4没有地址,因为它没有分配特定的内存。结果可能只存在于处理器寄存器中。
7 @% X2 D1 B9 @: N$ Y$ H内存必须分配,地址可以放入映射中。最简单最直接的方法就是为它创建局部变量。2 y  s) ?' V1 ^
看这个例子:
4 {% B! ]/ a% i$ y- p
    x,y := 1,2m := map[string]*int{"x": &x,"y": &y}d := *m["x"]   *m["y"]m["d"] = &dfmt.Println(m["d"],*m["d"])8 Q! m% _! Y3 C( Q4 G# i
输出(在Go Playground上试试):: K' K# L! a0 r/ H9 a5 j6 d
    0x10438300 3
    3 H" [) Q" _6 t# s3 M
注意:如果上面的代码是函数,局部变量(地址)d,即使我们从功能(即如果我们返回居住地图)继续下去map除了返回或创建-如全局变量)Go 中,获取并返回局部变量的地址是完全安全的。编译器将分析代码,如果地址(指针)转换函数,它将自动分配在堆上(而不是堆上)。- V0 i) d8 l6 z* {' p* t# i. K
注意#2:还有其他方法可以创建指向值指针,但它们只是技能,不是更好或更有效。使用局部变量是最干净和推荐的方法。" R' ^: a$ [0 d+ }' l# D( q( C
例如,这也可以在不创建局部变量的情况下工作,但显然根本不直观:1 F# E5 J% `  V" R: C
    m["d"] = &[]int{*m["x"]   *m["y"]}[0]$ ]' S/ j1 {7 V- E5 _8 E
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则