回答

收藏

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

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

很难用语言来描述它,但假设我有一个存储器int指针映射,并希望将操作结果存储为散列中的另一个键:& |& b% O4 x! ?- F. E8 q+ T# t6 c
    m := make(map[string]*int)m["d"] = &(*m["x"]   *m["y"])
    3 s- q; M8 [% f
这不起作用,给了我错误: cannot take the address of *m["x"] & *m["y"]+ ]4 [+ \4 H% K  B4 @: i1 N
                                                                4 Y2 M" W, J2 Z" B* [
    解决方案:                                                                & C9 @4 T+ Z" S$ n+ H" r
                                                                指针是内存地址。例如,变量在内存中有地址。5 \: F  u1 O' O: \1 h. R9 t
3   4没有地址,因为它没有分配特定的内存。结果可能只存在于处理器寄存器中。
6 O$ L" x4 T' q0 f5 B; h" `内存必须分配,地址可以放入映射中。最简单最直接的方法就是为它创建局部变量。
& |& F% W1 s$ L/ k1 L0 t看这个例子:" Z' u) g8 ^, i( E
    x,y := 1,2m := map[string]*int{"x": &x,"y": &y}d := *m["x"]   *m["y"]m["d"] = &dfmt.Println(m["d"],*m["d"])
    & Q2 Y1 o2 }& r5 J3 k
输出(在Go Playground上试试):4 b7 Z1 n$ k$ o! }
    0x10438300 3
    7 k6 A6 p" C* @* c
注意:如果上面的代码是函数,局部变量(地址)d,即使我们从功能(即如果我们返回居住地图)继续下去map除了返回或创建-如全局变量)Go 中,获取并返回局部变量的地址是完全安全的。编译器将分析代码,如果地址(指针)转换函数,它将自动分配在堆上(而不是堆上)。8 k9 i& ^6 M* m/ g0 I' C
注意#2:还有其他方法可以创建指向值指针,但它们只是技能,不是更好或更有效。使用局部变量是最干净和推荐的方法。
- e: O% G) w8 F5 d' ~& ^9 G: z" x例如,这也可以在不创建局部变量的情况下工作,但显然根本不直观:5 [9 s% v* d& Q+ B$ x# }6 O# S( A
    m["d"] = &[]int{*m["x"]   *m["y"]}[0]
    ; `# }  g% T7 i5 C- c. C
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则