理解 Go 中的指针解引用
指针解引用是 Go 中的基本操作,涉及访问指针变量指向的值。在问题中提到的示例中,指针用于操作自定义结构体 Vertex。
指针和结构
原始示例展示了 Vertex 实例的创建,包括使用指针对 Vertex 实例的引用。在修改后的示例中,发生以下情况:
t := *q q.X = 4
第一行取消引用指针 q 并将其基础值分配给 t,从而有效地创建指向的顶点的副本。随后,修改 q.X 会更新原始 Vertex 实例,但不会影响 t,因为 t 保存该结构的单独副本。
避免使用指针带来意外
以确保更改通过指针所做的操作会反映在其他引用中,因此指针的使用应保持一致。在下面修改后的示例中,t 和 q 都指向相同的底层 Vertex:
t := q
通过此更改,q.X = 4 现在更新 t 和 q 访问的 Vertex 实例,从而产生预期的输出:
{1 2} &{4 2} {1 0} {0 0} &{4 2} {4 2} true
C/C 中的并行
与“极其奇怪的行为”的看法相反,当涉及指针时,C/C 表现出类似的行为。以下 C 代码演示了这一点:
Vertex v = Vertex{1, 2}; Vertex* q = &v; Vertex t = *q; q->x = 4; std::cout << "*q: " << *q << "\n"; std::cout << " t: " << t << "\n";
输出类似于修改后的 Go 示例:
*q: { 4, 2 } t: { 1, 2 }
因此,Go 中观察到的指针取消引用行为与指针的行为一致在其他编程语言中,例如 C/C 。
以上是Go 中的指针解引用如何工作,与 C/C 相比如何?的详细内容。更多信息请关注PHP中文网其他相关文章!