🐧
[Go] Interface
インターフェースは、型の一種であり、任意の型がどのようなメソッドを実装するべきか、を規定するための枠組みのこと。
package main
import (
"fmt"
)
// 型みたいなイメージ。メソッドだけ定義する
type Human interface {
Say() //string
}
type Person struct {
Name string
}
// Person structは、Say()メソッドを持つことになる。
// Nameの実体を書き換えるので、*が必要
// 返り値にstring指定する
func (p *Person) Say() string{
p.Name = "Mr." + p.Name
fmt.Println(p.Name)
// stringと比較するためreturn p.Name
return p.Name
}
func DriveCar (human Human) {
if human.Say() == "Mr.Mike" {
fmt.Println("run")
} else {
fmt.Println("Out")
}
}
// Human Interfaceに、Person structを入れる。
// Say()メソッドがないと、エラーになる。
// ポインターレシーバーとして、&をつけないといけない。
func main() {
var mike Human = &Person{"Mike"}
mike.Say()
}
// Interface に、stringを指定しないと、以下エラー。
# command-line-arguments
./main.go:27:14: human.Say() used as value
./main.go:38:6: cannot use &Person literal (type *Person) as type Human in assignment:
*Person does not implement Human (wrong type for Say method)
have Say() string
want Say()
package main
import (
"fmt"
)
// 型みたいなイメージ。メソッドだけ定義する
type Human interface {
Say() string
}
type Person struct {
Name string
}
// Person structは、Say()メソッドを持つことになる。
// Nameの実体を書き換えるので、*が必要
// 返り値にstring指定する
func (p *Person) Say() string{
p.Name = "Mr." + p.Name
fmt.Println(p.Name)
// stringと比較するためreturn p.Name
return p.Name
}
func DriveCar (human Human) {
if human.Say() == "Mr.Mike" {
fmt.Println("run")
} else {
fmt.Println("Out")
}
}
// Human Interfaceに、Person structを入れる。
// Say()メソッドがないと、エラーになる。
// ポインターレシーバーとして、&をつけないといけない。
func main() {
var mike Human = &Person{"Mike"}
mike.Say()
}
Mr.Mike
Discussion