初始化
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 的應用區別