簡體   English   中英

如何在 Golang 中正確使用指針

[英]How to use Pointers correctly in Golang

我是go語言的新手,並且處於我的程序可以工作但不確定我是否應該使用指針的場景中。

這是我的程序:

package main

import (
    "fmt"
    "math"
)

type Shape interface {
    getVolume() float64
}

type Cube struct {
    Side float64
}

type RectanglePrism struct {
    Length float64
    Width  float64
    Height float64
}


func main() {
    c := Cube{Side: 3}
    r := RectanglePrism{Length: 4, Width: 3, Height: 3}
    fmt.Println(Volume(c))
    fmt.Println(Volume(r))

}

func (c Cube) getVolume() float64 {
    return math.Pow(c.Side, 3)
}

func Volume(s Shape) float64 {
    return s.getVolume()
}

func (r RectanglePrism) getVolume() float64 {
    return r.Length * r.Width * r.Height
}

游樂場: https://play.golang.org/p/LKSvJXNCEbQ

正如您所看到的, Volume不會修改c中的值,只是進行計算,因此它不一定需要指向原始值 - 但是它會進行更昂貴的副本

我的問題是:

  • getVolume()應該接收一個指向CubeRectangularPrism的指針?
  • 有沒有更好的方法來做到這一點?

這里的目標是正確高效的代碼。

提前致謝

如本https://golang.org/doc/faq#methods_on_values_or_pointers中所定義

如果您正在修改結構中的數據或處理大量數據,或者您的結構非常龐大,則最好使用指針。

與上述情況一樣,如果您通過值傳遞它,它會有所不同,因為通過每個 function 調用您傳遞結構的新副本,這可能會影響您的應用程序的效率。

對於非常小的數據,通過值或指針傳遞它不會產生影響,因為差異可以忽略不計(就像在你的例子中它不會產生影響) https://play.golang.org/p/t3_Xzhq88g-

如果您決定調用 function 的方式,您的所有其他函數也必須以類似的方式調用。

所以分析你的用例(這些是一些建議性用例,可能會有更多場景)

1)你要修改結構中的數據嗎

2)數據會很大嗎

3)或者如果結構會很大

4)你要返回修改后的值嗎(就像你的例子一樣)

並基於您這些您可以使用指針或按值傳遞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM