☑本記事の内容
- non-structのメソッド
- インターフェース
- タイプアサーション
Go言語入門 -non-structのメソッド-
✔non-structのメソッドの目次
基本的なこと
- struct以外でもメソッドは使用できる
- あまり使わないので頭の片隅にあるくらいでOK
package main
import "fmt"
type MyInt int
func (i MyInt) Double() int {
return int(i * 2)
}
func main() {
myInt := MyInt(10)
fmt.Println(myInt.Double())
}
(結果)
20
- intの場合だとキャストをしないとエラーになる
- 関数となっているためエラーが発生する
package main
import "fmt"
type MyInt int
func (i MyInt) Double() int {
fmt.Printf("%T %v\n", i, i)
fmt.Printf("%T %v\n", 1, 1)
return int(i * 2)
}
func main() {
myInt := MyInt(10)
fmt.Println(myInt.Double())
}
(結果)
main.MyInt 10
int 1
20
Go言語入門 -インターフェース-
✔インターフェースの目次
基本的なこと
- インターフェースはメソッド名のみを記載する
- 実装は別の関数を使って書く
- 型みたいな印象
package main
import "fmt"
type Human interface {
Say()
}
type Person struct {
Name string
}
func (p Person) Say() {
fmt.Println(p.Name)
}
func main() {
var mike Human = Person{"Mike"}
mike.Say()
}
(結果)
Mike
値を書き換えたい場合
- ポインタを使用する
- アスタリスク(*)を使用して、&をつけアドレスを渡す
package main
import "fmt"
type Human interface {
Say()
}
type Person struct {
Name string
}
func (p *Person) Say() {
p.Name = "Mr." + p.Name
fmt.Println(p.Name)
}
func main() {
var mike Human = &Person{"Mike"}
mike.Say()
}
(結果)
Mr.Mike
Go言語入門 -タイプアサーション-
✔タイプアサーションの目次
基本的なこと
- interface{}だと複数の異なる型でも入れることが出来る
- 出力する時はそのままだとエラーになるので、タイプアサーションをする
- i.(int)のように後ろに型をつける
package main
import "fmt"
func do(i interface{}) {
ii := i.(int)
ii *= 2
fmt.Println(ii)
}
func main() {
do(10)
}
(結果)
20
複数の型を入れた際の出力
- interface{}に複数の型を入れた際にはswitch type文を使用する
- typeのタイプアサーションはswitchとセットでしか使用できない
package main
import "fmt"
func do(i interface{}) {
switch v := i.(type) {
case int:
fmt.Println(v * 2)
case string:
fmt.Println(v + "!")
default:
fmt.Printf("I don't know %T\n", v)
}
}
func main() {
do(10)
do("Mike")
do(true)
}
(結果)
20
Mike!
I don't know bool