🐧

[Go] Interface

2022/09/26に公開

インターフェースは、型の一種であり、任意の型がどのようなメソッドを実装するべきか、を規定するための枠組みのこと。

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