質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

2回答

3475閲覧

[golang]関数の引数に取ったポインタ変数の扱い方

退会済みユーザー

退会済みユーザー

総合スコア0

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2017/11/19 11:23

編集2017/11/19 11:24

#聞きたいこと

ある関数に変数のポインタを渡しました

go

1func main() { 2 var salt bool 3 call(&salt) 4 fmt.Println(salt) //true 5} 6 7func call(lim *bool) { 8 *lim = true 9}

これ、関数内で
*lim = true
としなきゃいけませんよね

でも、例えば、anaconda(twitterAPI)を使った時の

go

1 2func main() { 3 api := createApi() //apiには*anaconda.TwitterApiが代入される 4 something(api) 5} 6/* 7apiを作って返す関数 8*/ 9func createAPI() *anaconda.TwitterApi { 10 anaconda.SetConsumerKey("KEY") 11 anaconda.SetConsumerSecret("SEC") 12 api := anaconda.NewTwitterApi("TOKEN", "SEC") 13 return api 14{ 15 16func something(api *anaconda.TwitterApi) { 17 f, err := api.GetFriendsIds(nil) //これはフォローしてる人のIdをスライスとして返す関数です 18 //https://godoc.org/github.com/ChimeraCoder/anaconda#TwitterApi.GetFriendsIds 19 if err != nil { 20 log.Println(err) 21 } 22}

この場合のsomething()関数では
*anaconda.TwitterApiの関数を使う際
*api.GetFriendsIds(nil)
ではなく
api.GetFriendsIds(nil)
になりますよね?

なんで上の例ではlimに対して*をつけなければいけなくて
下の例ではapiに対して*をつけないんですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

別に*付けたければ付けてもいいですよ

go

1package main 2 3import ( 4 "fmt" 5) 6 7type API struct{ 8 x int 9} 10 11func main() { 12 api := API{0} 13 fmt.Println(api.x); 14 call(&api, 100); 15 fmt.Println((&api).x); 16} 17 18func call(api *API, num int) { 19 (*api).x = num; 20} 21

ただ優先順位の関係で括弧で括らないといけないので
Goでは.はC++言語でいう.と->を兼ねているんです

投稿2017/11/20 02:18

編集2017/11/20 02:19
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

limは変数であり、中身を変えたいので*lim = trueですが
apiはstructであり、api.GetFriendsIds(nil) は単にfunctionをコールしているだけですので*は必要ないかと思います。
もしapiのstructの中にある変数の値を変えたい場合には*が必要です。

Go

1package main 2 3import ( 4 "fmt" 5) 6 7type API struct { 8 lim *bool 9} 10 11func main() { 12 b := false 13 api := API{&b} 14 fmt.Println(b) 15 fmt.Println(*api.lim) // 中身を表示する場合は* 16 call(&api) 17 fmt.Println(b) 18 fmt.Println(*api.lim) // 中身を表示する場合は* 19} 20 21func call(api *API) { 22 api.test() // function callは*不要 23} 24 25func (api *API) test() { 26 *api.lim = true // 中身を変えたいなら* 27}
false false true true

投稿2017/11/20 00:08

編集2017/11/20 00:11
yuki-saito

総合スコア928

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/20 01:37

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問