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

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

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

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

Q&A

解決済

2回答

536閲覧

【Go】宣言したSwitch文の挙動が理解出来ない。Defined Type, Stringerインターフェースも絡んでると思います。

nyako

総合スコア45

Go

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

0グッド

0クリップ

投稿2022/06/03 09:12

Go

1package main 2 3import "fmt" 4 5type ProductCode int 6 7const Btcjpy ProductCode = 0 8const Ethjpy ProductCode = 1 9 10func (code ProductCode) String() string { 11 switch code { 12 case Btcjpy: 13 return "BTC_JPY" 14 case Ethjpy: 15 return "ETH_JPY" 16 default: 17 return "BTC_JPY" 18 } 19} 20func main() { 21 code := Btcjpy.String() 22 fmt.Println(code) 23}

上記の様なコードがあります。

分からないこと

main関数でBtcjpy.String()とすると
const Btcjpy ProductCode = 0 なので、0.String()と同義だと思います。
その後、Stringメソッドを呼び出すのでレシーバーのcodeには0が入ると思います。
その後にSwitchでcodeがBtcjpyならBTC_JPYを返すと書いてあります。
ただここでレシーバー(code)には0が入っているのに、
なぜcase Btcjpy: と出来るのか謎です。
僕が思うのは結果としては間違えているのは分かっているのですが、

Go

1func (code ProductCode) String() string { 2 switch code { 3 case 0: 4 return "BTC_JPY" 5 case 1: 6 return "ETH_JPY" 7 default: 8 return "BTC_JPY" 9 } 10}

なら辻褄が合うと思って仕方がありません。

僕が理解できてないところ、解決していただけないでしょうか。
何か基礎的な文法の知識が欠落してる可能性、勘違いしている可能性もあります。

宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ご回答に対する返事にて解決済みです。

投稿2022/06/07 05:24

nyako

総合スコア45

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

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

0

ベストアンサー

ProductCode型とint型はあくまでべつの型として扱われます。
また、コンパイラは常に値の型を把握した状態でコンパイル処理を行います。

なので、辻褄が合うと後から提示したコードはコンパイルエラーになるはずです。
「0.String()」は「int(0).String()」としてint型のStringメソッドをコンパイラは探しますが存在しないのでエラーになります。

「Btcjpy.String()」であれば「ProductCode(0).String()」としてProductCode型のStringメソッドをコンパイラが探して見つけてコンパイルできるという結果になります。

投稿2022/06/03 12:45

編集2022/06/03 12:49
nobonobo

総合スコア3367

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

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

nyako

2022/06/03 13:37

nobobo様ありがとうございます。 switch code { case Btcjpy: ここのcodeは僕が最初に載せたコードだとなにが入っていますでしょうか。
nobonobo

2022/06/03 15:58 編集

メソッドにはレシーバーが存在します。それがfuncとString()の間に書かれた記述がレシーバーを示しています。 main関数の記述でそのレシーバーに該当するものは「Btcjpy」です。なのでBtcjpy.String()を呼び出したとき、Stringメソッド内のcodeの値は「int(0)」ではなく、「Btcjpy==ProductCode(0)」になります。
nyako

2022/06/07 05:24

nobonoboさん本当にありがとうございます。 メソッドに対する理解不足でした。 単純にレシーバ.メソッドで呼び出すというところで勝手にBtcJpy変数を呼びだしていると思っていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問