指针引用内存中的位置。据我所知,实际上所有内存地址都具有相同的类型,而与变量类型无关。而不是使用不同的指针类型(*int等*string),这是否可能只对所有指针类型使用一种类型(var p pointer)?不同的指针类型有什么区别?package mainimport "fmt"func main() { i := 5 s := "abc" var pi *int // alternatively var pi pointer var ps *string // alternatively var ps pointer pi = &i ps = &s fmt.Printf("%p %p", pi, ps) // result is 0x1040e0f8 0x1040a120}考虑以下结构:type Queue struct { Elements []int}有什么不同:func NewQueue() Queue { queue := Queue{} return queue}和func NewQueue() *Queue { queue := &Queue{} return queue}对我来说,这看起来几乎是一样的,(实际上尝试使用一些入队和出队会产生相同的结果)但我仍然在野外看到这两种用法,所以也许一个更可取。
1 回答
一只甜甜圈
TA贡献1836条经验 获得超5个赞
可以返回一个值,然后调用者调用具有指针接收器的方法。但是,如果调用者总是想要使用指针,因为对象很大或者因为方法需要就地修改它,那么您最好返回一个指针。指针与值是 Go 中的一个常见问题,并且有一个答案试图分解何时使用其中一个或另一个。
在 slice-backed 类型的特定情况下,Queue
作为值复制非常小且快速,但是如果您希望能够复制它并让每个人看到相同的数据,无论访问哪个副本,您将需要使用指针,因为切片实际上是起始指针、长度和容量的一个小结构,当您重新切片或增长它时,这些会发生变化。如果这是一个惊喜,Go 博客文章中有关切片使用和内部的机制append
可能是有用的阅读。
如果您的队列不是用于共享或传递,而是用于在单个函数中本地使用,您可以提供一个append
-style 接口,其中操作返回修改后的队列,但此时您可能只想直接使用切片技巧。
(如果您的队列打算同时使用,请认真考虑使用缓冲通道。它可能与您想象的不完全一样,但实施者已经为您解决了很多棘手的问题。)
另外——如果真的Queue
是一个添加了方法的切片,你可以制作它。type Queue []int
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消