2017-01-08 4 views
1

私はGoを学ぼうとしています。私は構造体と配列が値によってコピーされることを知っています(関数に渡すか、変数に代入するとき)。だから私たちはポインタを使ってそれらを修正し、メモリを節約します。メソッドでポインタを使用して構造体へのポインタを返すのはいつですか?

状況によっては、常に構造体へのポインタが使用されていることがあります。例えば

an official web application tutorialに、彼らは何のデータ変更は、構造体に発生していない。ここ

func (p *Page) save() error { 
    filename := p.Title + ".txt" 
    return ioutil.WriteFile(filename, p.Body, 0600) 
} 

それをコードを使用していました。これは、公式パッケージやサードパーティのパッケージの他の場所で発生します。

もう1つのケースは、& struct {}を返す場合です。上記の同じリンクの例:

func loadPage(title string) *Page { 
    filename := title + ".txt" 
    body, _ := ioutil.ReadFile(filename) 
    return &Page{Title: title, Body: body} 
} 

したがって、どの場合、ポインタを使用する必要がありますか?

+0

[なぜ返信先のコンストラクタを作成する必要がありますか?](http://stackoverflow.com/questions/31932822/why-should-constructor-of-go-return-address/31934189#31934189) – icza

答えて

0

これは、私たちがメモリ使用量を節約するためにポインタを使用することができることについては涼しいと思います。

私の場合データベースからデータを取得して何かを変更したいときはいつでもポインタを使用します。ポインタを使用してメモリ使用量を節約します。

例:

func GetUserShopInfo(w http.ResponseWriter, r *http.Request, params httprouter.Params) { 
    //.... 
    shop_data, err := shop.GetUserShopInfo(user_id) 
    // manipulate shop_data 
    shop.ChangeValue(&shop_data) 
    // you will get the result here without creating new variable 

} 

そして私は私が価値を共有したい時はいつでも、ポインタを使用して、結果を得るために新しい変数を作成することなく、それらを変更します。

例:

func main(){ 
    a := 10 
    ChangeValue(&a) 
    // a will change here 
}  


func ChangeValue(a *int){ 
    // do something to a 
} 

構造体についても同じこと。私は価値を共有したいと感じるたびに、私はすべてのケースでは、ポインタを使用結論

type Student struct { 
    Human 
    Schoool string 
    Loan float32 
} 

// use pointer so that we can modify the Loan value from previous 
func (s *Student) BorrowMoney(amount float32) { 
    s.Loan += amount 
} 

:私は

変数の例の値を渡すと、変更できるように、私は、ポインタを使用していました。

+1

ポインタを渡すと、ヒープにエスケープされます。スタック内で安価に(値渡しで)渡すことができる小さな構造体では、時間の経過とともに不要なGCの圧力が発生する可能性があります。それは常にトレードオフです。 – Nadh

関連する問題