为了账号安全,请及时绑定邮箱和手机立即绑定

在初始化方法中返回指针和值之间的区别

在初始化方法中返回指针和值之间的区别

Go
幕布斯6054654 2022-04-20 17:54:02
指针引用内存中的位置。据我所知,实际上所有内存地址都具有相同的类型,而与变量类型无关。而不是使用不同的指针类型(*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


查看完整回答
反对 回复 2022-04-20
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信