[英]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()
應該接收一個指向Cube
和RectangularPrism
的指針?這里的目標是正確高效的代碼。
提前致謝
如本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.