初始化
package main
import (
"fmt"
)
type Animal interface {
Speak() string
}
type Dog struct {
}
func (d Dog) Speak() string {
return "Woof!"
}
func main() {
var a Animal
a = Dog{}
fmt.Println(a.Speak())
}
1、类型判断与type switch
package main
import (
"fmt"
)
type Animal interface {
Speak() string
}
type Dog struct {
name string
}
func (d Dog) Speak() string {
return "i am dog"
}
func (d Dog) Run() string {
return "dog running"
}
type Cat struct {
name string
}
func (c Cat) Speak() string {
return "i am cat"
}
func main() {
d := Dog{}
dogRun(d)
c := Cat{}
animalSpeak(d)
animalSpeak(c)
}
func animalSpeak(a Animal) {
switch a.(type) {
case Dog:
fmt.Println(a.Speak())
case Cat:
fmt.Println(a.Speak())
default:
fmt.Println("unknow")
}
}
func dogRun(a Animal) {
if v, ok := a.(Dog); ok {
fmt.Println(v.Run())
return
}
fmt.Println("i am not dog")
}
2、数据类型强制转换,只是发生拷贝不是引用
package main
import (
"fmt"
)
type USB interface {
Name() string
Connector
}
type Connector interface {
connect()
}
type phone struct {
name string
}
func (p phone) Name() string {
return p.name
}
func (p phone) connect() {
fmt.Println("connect", p.name)
}
func main() {
a := phone{"iphone"}
a.connect()
var v USB
v = USB(a)
v.connect()
a.name = "cll"
a.connect()
v.connect()
}
3、interface{}做为参数可以接受任意类型
package main
import (
"fmt"
)
type Animal interface {
Speak() string
}
type Dog struct {
name string
}
func (d Dog) Speak() string {
return "i am dog"
}
func (d Dog) Run() string {
return "dog running"
}
func main() {
d := Dog{}
myprint(d)
myprint("hello world")
myprint([2]int{1, 2})
myprint(nil)
myprint(new(Dog))
myprint(make([]int, 2, 10))
}
func myprint(v interface{}) {
fmt.Println(v)
}
4、interface内存包括两个值,一个类型,一个值
5、指针,类型作为receiver的区别
func (c *Cat) Speak() string {
return "Meow!"
}
func (c Cat) Speak() string {
return "Meow!"
}
第一种情况只能被new(Cat)转换,不能被Cat{}转换
第二种能被new(Cat),也能被cat{}转换
参考:http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go
6、指针receiver 和 值receiver 的应用区别