亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在初始化方法中返回指針和值之間的區別

在初始化方法中返回指針和值之間的區別

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 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號