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

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

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

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

Q&A

解決済

2回答

367閲覧

関数のreturnの使い方

Palo_Punte

総合スコア21

Go

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

0グッド

0クリップ

投稿2020/05/23 09:26

簡略化のためにmain()の中にmain()にありますが・・・
上のコードの場合sql.Openの返り値がerrであればreturnでhoge()を抜けmain()関数の中に戻れるのですが、下のコードのように接続を別関数にまとめて同じ事をする場合はどのように記載すれば良いのでしょうか?
下のコードの場合errとそうでない場合とで返り値の型が違うのでそもそもコード自体がエラーになってしまうのですが仮にerrのreturnが発動できてもhoge2()を抜けるだけでhoge()までは抜けてはくれないのでmain()には戻れないのですよね?
どのように書けば良いのでしょうか?

func main (){ hoge() main() } func hoge() { db, err := sql.Open("mysql", "root:@/my_database") if err != nil { fmt.Println(err) return } defer db.Close() db.Query・・・(略)//dbに接続できたら以下処理 }
func main (){ hoge() main() } func hoge() { db := hoge2() defer db.Close() db.Query・・・(略)//dbに接続できたら以下処理 } func hoge2(){ db, err := sql.Open("mysql", "root:@/my_database") if err != nil { fmt.Println(err) return } return db }

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

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

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

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

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

guest

回答2

0

ベストアンサー

import 文が省略されていますが、sql.Open は https://golang.org/pkg/database/sql/#Open を用いていると思いますので、その前提で回答します。

関数内での値の戻し方は以下のように書くのが一般的です。エラーが発生した場合の *sql.DB の値は nil を返します。

go

1func hoge2() (*sql.DB, error) { 2 db, err := sql.Open("mysql", "root:@/my_database") 3 if err != nil { 4 fmt.Println(err) 5 // err は fmt.Errorf などでラップすることもあると思います。 6 // あるいはスタックトレースを出力するために xerrors.Errorf などを用いるなど 7 return nil, err 8 } 9 return db, nil 10}

で hoge 関数の一例は以下のように error インターフェースを戻すようにして hoge2() で発生したエラーは以下のようにして呼び元にエラーを戻します。

go

1func hoge() error { 2 db, err := hoge2() 3 if err != nil { 4 return err 5 } 6 defer db.Close() 7 db.Query・・・(略)//dbに接続できたら以下処理 8 9 // ... 10 11 return nil 12}

最終的に main 関数の中で、エラーに応じたハンドリングをします。たとえばログ出力など。

go

1func main() { 2 if err := hoge(); err != nil { 3 log.Fatalf("%+v", err) 4 } 5}

投稿2020/05/23 10:45

d_tutuz

総合スコア730

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

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

Palo_Punte

2020/05/23 12:57

dbとerrで返ってきていない方をnillにして両方ともreturnをすればよかったのですね ご回答ありがとうございます これで書けそうです
guest

0

その関数から、エラーかどうかの返り値を返せばいいです

って、このコードでは無限ループになって実行エラーになってしまいますね.

投稿2020/05/23 09:30

編集2020/05/23 09:32
y_waiwai

総合スコア88042

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

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

Palo_Punte

2020/05/23 12:58

ご回答ありがとうございました 助かります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問