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

指针引用内存中的位置。据我所知,实际上所有内存地址都具有相同的类型,而与变量类型无关。


而不是使用不同的指针类型(*int等*string),这是否可能只对所有指针类型使用一种类型(var p pointer)?


不同的指针类型有什么区别?


package main


import "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

}

对我来说,这看起来几乎是一样的,(实际上尝试使用一些入队和出队会产生相同的结果)但我仍然在野外看到这两种用法,所以也许一个更可取。


幕布斯6054654
浏览 146回答 1
1回答

一只甜甜圈

可以返回一个值,然后调用者调用具有指针接收器的方法。但是,如果调用者总是想要使用指针,因为对象很大或者因为方法需要就地修改它,那么您最好返回一个指针。指针与值是 Go 中的一个常见问题,并且有一个答案试图分解何时使用其中一个或另一个。在 slice-backed 类型的特定情况下,Queue作为值复制非常小且快速,但是如果您希望能够复制它并让每个人看到相同的数据,无论访问哪个副本,您将需要使用指针,因为切片实际上是起始指针、长度和容量的一个小结构,当您重新切片或增长它时,这些会发生变化。如果这是一个惊喜,Go 博客文章中有关切片使用和内部的机制append可能是有用的阅读。如果您的队列不是用于共享或传递,而是用于在单个函数中本地使用,您可以提供一个append-style 接口,其中操作返回修改后的队列,但此时您可能只想直接使用切片技巧。(如果您的队列打算同时使用,请认真考虑使用缓冲通道。它可能与您想象的不完全一样,但实施者已经为您解决了很多棘手的问题。)另外——如果真的Queue是一个添加了方法的切片,你可以制作它。type Queue []int
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go