エンジニアもどきの雑記

メモ帳です。きっと。macアプリ配信windowsでもできるようになるまで絶対にメイン機にしないマン。特筆しない限り環境は【win10home,i5-7200u,8g,64bit,巨乳が好き】

Goのinterfaceを復習する


大した理解がまだないけども。
次の現場がGoで行きたいので復習する。

Goは強力な型付けがメリットであるが、
どうしてもそこらへんを柔軟に対応したい時がある。

そこで何でも入れることができるinteface{}
で、あってるかな。

よく見るのは似たような処理をするメソッドを一つに
まとめるための利用。

package main

import "fmt"

type Like interface {
        Language()
}

type Me struct{}
type You struct{}

func (m *Me) Language() {
        fmt.Println("Golang")
}

func (y *You) Language() {
        fmt.Println("JavaScript")
}

func SayLikeLanguage(l Like) {
        l.Language()
}

func main() {
        m := new(Me)
        y := new(You)

        SayLikeLanguage(m)
        SayLikeLanguage(y)
}
//結果
go run app.go
Golang
JavaScript


MeとYouの空の構造体を定義して、それに属するメソッドLanguageを作成。
それぞれ好きな言語を表示するだけ。

話はそれるけどjavascriptで何でもしようとする人いるよね。


それぞれのメソッドのレシーバが違うが、やってることはfmt.Printlnだけ。 なので、intefaceを使ってまとめてる。
はず。


何でも入るっていうのが以下

package main

import "fmt"

var x interface{}

func main() {
        y := x
        y = 1

        if valY, ok := y.(int); ok {
                fmt.Printf("y: %d\n", valY)
        }

        z := x
        z = "hogehoge"

        if valZ, ok := z.(string); ok {
                fmt.Printf("z: %s\n", valZ)
        }
}

//結果
go run app.go
y: 1
z: hogehoge


var x interface{}で指定している通り、xはinteface{}型

そのxを代入したyとzを用意して、
それぞれにint型とstr型を代入。

この時yは1でzはhogeだけど、int型とstr型じゃなくて、どちらもinteface{}型になってる。
そのため、そのままfmt.Println(y)とかやるとエラーになる。
inteface{}型をそのまま表示はできませんよって。

そこで型アサーション
inteface{}型.(<型>)で型を変更する。

それぞれをintとstringに変換して表示してる。
okには型アサーションの成功の結果が入る。


これ。
頭の中に入ってはいるんだけど、いざ一人でよしかくぞってやると後からここinterface使えばいいじゃんってなるからまだまだ経験が足りない。

頑張ろう。