一,接口
一个接口被定义为方法签名的集,一个接口类型的值可以放任何声明了那些方法的值
package main
import (
"fmt"
)
type Adder interface {
Add() int
}
type MyI int
func (f MyI) Add() int {
return int(f + 20)
}
type Vertex struct {
X, Y int
}
func (v *Vertex) Add() int {
return v.X + v.Y
}
func main() {
var a Adder
f := MyI(10)
v := Vertex{1, 2}
a = f
fmt.Println(a.Add())
a = &v
fmt.Println(a.Add())
}
运行结果为:
30
3
二,接口的简单声明
接口可以简单声明
package main
import "fmt"
type She interface {
Like()
}
type T struct {
favor1 string
number int
}
func (t T) Like() {
fmt.Println("She's favor is", t.favor1)
fmt.Println("She's luck number is", t.number)
}
func main() {
var she She = T{"Swimming", 8}
she.Like()
}
运行结果为:
She's favor is Swimming
She's luck number is 8
三,接口的值
接口值可以是一个值和混合类型的元祖的,像(value, type)
这样的
package main
import (
"fmt"
"math"
)
type I interface {
Ask()
}
type T struct {
S string
}
func (t *T) Ask() {
fmt.Printf("What is her question : %s", t.S)
}
type F float64
func (f F) Ask() {
fmt.Println(f)
}
func main() {
var i I
i = &T{"Do you what is this value of Pi ?"}
result(i)
i.Ask()
i = F(math.Pi)
result(i)
}
func result(i I) {
fmt.Printf("\nthis Value is %v ; \nthis Type is %T \n", i, i)
}
运行结果为:
this Value is &{Do you what is this value of Pi ?} ;
this Type is *main.T
What is her question : Do you what is this value of Pi ?
this Value is 3.141592653589793 ;
this Type is main.F
四,空接口
没有指定任何类型方法的接口是空接口,如:interface{}
空接口可以接受任何类型的值
package main
import "fmt"
func main() {
var i interface{}
describe(i)
i = 2020
describe(i)
i = "你好"
describe(i)
}
func describe(i interface{}) {
fmt.Printf("(%v, %T)\n", i, i)
}
运行结果为:
(<nil>, <nil>)
(2020, int)
(你好, string)