Go有什么指针?

我知道Go中的指针允许函数参数的变异,但是如果它们只采用引用(使用适当的const或可修饰的修饰符)就不会更简单。 现在我们有指针和一些内置的types,比如地图和通道隐式通过引用。

我是否错过了某些东西,或者在Go中只是一个不必要的并发症?

引用不能被重新分配,而指针可以。 仅在这种情况下,这些指针就可以在许多不能使用引用的情况下使用。

我真的很喜欢从http://www.golang-book.com/8取得的例子;

func zero(x int) { x = 0 } func main() { x := 5 zero(x) fmt.Println(x) // x is still 5 } 

与…形成对比

 func zero(xPtr *int) { *xPtr = 0 } func main() { x := 5 zero(&x) fmt.Println(x) // x is 0 } 

Go的devise是一个简洁,简约的语言。 因此,它开始只是价值观和指针。 之后,必要时,添加了一些参考types(切片,地图和通道)。


Go编程语言:语言devise常见问题解答:为什么映射,片和通道引用数组是值?

“关于这个话题有很多历史,早期的地图和频道都是语法指针,不可能声明或使用非指针实例,而且我们也在努力应付数组的工作方式,最终我们决定严格分离指针和值的使用使得语言难以使用引入引用types,包括切片来处理数组的引用forms,解决了这些问题。引用types增加了语言的一些令人遗憾的复杂性,但是它们对可用性有很大的影响:Go变成了更高效,更舒适的语言。“


快速编译是Go编程语言的主要devise目标; 有它的成本。 其中一个伤亡似乎是将variables(基本编译时间常量除外)和参数标记为不可变的能力。 已经被要求,但被拒绝了。


golang-nuts:去语言。 一些反馈和怀疑。

“将const添加到types系统会迫使它在任何地方出现,并且迫使其中一个在任何地方发生变化时将其移除。尽pipe标记对象在某些方面是不可变的,但我们不认为consttypes限定符是这样的去“。

指针是有用的有几个原因。 指针允许控制内存布局(影响CPUcaching的效率)。 在Go中,我们可以定义一个所有成员都在连续记忆中的结构:

 type Point struct { x, y int } type LineSegment struct { source, destination Point } 

在这种情况下, Point结构embedded在LineSegment结构中。 但是你不能总是直接embedded数据。 如果你想支持二叉树或链表等结构,那么你需要支持某种types的指针。

 type TreeNode { value int left *TreeNode right *TreeNode } 

Java,Python等没有这个问题,因为它不允许你embedded复合types,所以没有必要在语法上区分embedded和指向。

Swift / C#结构的问题用Go指针解决

一个可能的替代方法是以C#和Swift来区分structclass 。 但这确实有局限性。 尽pipe通常可以指定函数将结构作为inout参数来避免复制结构,但不允许将引用(指针)存储到结构中。 这意味着当你发现有用的时候,你永远不能把结构当作引用types,例如创build一个池分配器(见下面)。

自定义内存分配器

使用指针,你也可以创build你自己的池分配器(这是非常简化,大量的检查删除,只是显示原则):

 type TreeNode { value int left *TreeNode right *TreeNode nextFreeNode *TreeNode; // For memory allocation } var pool [1024]TreeNode var firstFreeNode *TreeNode = &pool[0] func poolAlloc() *TreeNode { node := firstFreeNode firstFreeNode = firstFreeNode.nextFreeNode return node } func freeNode(node *TreeNode) { node.nextFreeNode = firstFreeNode firstFreeNode = node } 

交换两个值

指针还允许您执行swap 。 这是交换两个variables的值:

 func swap(a *int, b *int) { temp := *a *a = *b *b = temp } 

结论

由于缺乏控制内存布局和使用的能力(caching缺失严重影响性能),Java在诸如Google之类的系统编程中从未能完全取代C ++,部分原因是性能无法调整到相同的扩展。 Go的目标是在许多领域取代C ++,因此需要支持指针。