interface를 직역하면 상호작용면
인터페이스를 이용하면 메서드 구현을 포함한 구체화된 객체가 아닌 추상화된 객체로 상호작용 가능
type DuckInterface interface {
Fly()
Walk(distance int) int
}
인터페이스 메서드 집합의 유의사항
1. 메서드는 반드시 메서드명이 있어야 한다.
2. 매개변수와 반환이 다르더라도 이름이 같은 메서드는 있을 수 없다.
3. 메서드 구현을 포함하지 않는다.
type Human interface {
Speak() string
}
type Korean struct {
Name string
Age int
}
type Japanese struct {
Name string
Age int
}
func (k Korean) Speak() string {
return "안녕하세요"
}
func (k Japanese) Speak() string {
return "こんにちは"
}
func Test_interface(t *testing.T) {
var human Human
human = Korean{"Coen", 34}
t.Log(human.Speak())
human = Japanese{"Coen", 34}
t.Log(human.Speak())
}
위에서 Human 이라는 인터페이스를 선언
Korean과 Japanese라는 리시버에 Speak()라는 메소드를 구현
Human에 Korean과 Japanese라는 구현체를 대입할 수 있다.
각 구현체에서 메서드를 호출하면 구현한 반환값이 반환된다.
type Reader interface {
Read()
Close()
}
type Writer interface {
Write()
Close()
}
type ReadWriter interface {
Reader
Writer
}
type People struct {
Name string
}
func (h People) Read() {
fmt.Println("Read")
}
func (h People) Write() {
fmt.Println("Write")
}
func (h People) Close() {
fmt.Println("Close")
}
func Test_interfaceIncludeInterface(t *testing.T) {
var readWriter ReadWriter
var writer Writer
var reader Reader
readWriter = People{"Coen"}
writer = People{"Coen"}
reader = People{"Coen"}
readWriter.Read()
writer.Write()
reader.Close()
}
func GuessMyType(i interface{}) string {
switch v := i.(type) {
case int:
return "int"
case string:
return "string"
case bool:
return "bool"
default:
return fmt.Sprintf("%T", v)
}
}
func Test_emptyInterface(t *testing.T) {
t.Log(GuessMyType(1))
t.Log(GuessMyType("1"))
t.Log(GuessMyType(true))
t.Log(GuessMyType(1.1))
t.Log(GuessMyType([]int{1, 2, 3}))
}
func Test_interfaceIsNil(t *testing.T) {
var readWriter ReadWriter
var people People
t.Log(readWriter) //nil
t.Log(people) //{}
}
func interfaceToStruct(readWriter interface{}) {
if t, ok := readWriter.(People); ok {
log.Println(t)
} else {
log.Println("Its not People")
}
}
func Test_interfaceToStruct(t *testing.T) {
var readWriter ReadWriter
readWriter = People{Name: "Coen"}
interfaceToStruct(readWriter) //{Coen}
interfaceToStruct(Korean{}) //Its not People
}