1. 程式人生 > 實用技巧 >Go之介面

Go之介面

package main
import "fmt"
type dog struct{}
func (d dog)say(){
	fmt.Println("汪汪汪")
}
type cat struct{}
// 值接收者實現介面
func (d cat)say(){
	fmt.Println("喵喵喵")
}

type person struct{}
// 指標接收者實現介面
func (p *person)say(){
	fmt.Println("啊啊啊")
}
// 介面不管你是什麼型別,它只管你要實現什麼方法
// 定義一個抽象的型別。只要實現了say()的型別都可以成為sayer
type sayer interface{
	say()
}
// 打的函式
func da(arg sayer){
	arg.say()
}
func main(){
	// 在go語言中,介面是一種型別,是一種抽象的型別
	// 介面做的事情就像是定義一個協議(規則)
	// 只要一臺輯器有洗衣服和帥乾的功能
	// 我們就稱它為洗衣機。不關心屬性(資料),只關心行為(方法)
	//  一個物件只要全部實現了介面中的方法,那麼就實現了該介面
	c1 := cat{}
	da(c1)
	d1 := dog{}
	da(d1)

	// 使用值型別接收者實現介面
	// 型別的值和型別的指標都能夠儲存到介面
	var s sayer
	c2 := cat{}
	s = &c2
	s = c2
	fmt.Println(s)

	// 使用指標接收者實現介面。
	// 只有指標型別能夠儲存到介面變數中
	p1 := &person{}
	s = p1
	fmt.Println(s)

	// 空介面
	// 空介面是指沒有定義任何方法的介面
	// 因此任何型別都實現了空介面
	// 空介面的型別可以儲存任意型別的變數
	var x interface{}
	x = 100
	x = true
	x = "你猜我是誰"
	fmt.Println(x)
	// 型別斷言
	_, ok := x.(string)
	
	fmt.Println(ok) // 如果x是string型別,ok是true,否則是flase

	// 使用空介面作為函式的引數
	myPrintln("ddd")	
	// 空介面作為map的value
	var m = make(map[string]interface{})
	m["name"] = "娜扎"
	m["age"] = 18
	myPrintln(m)
}


func  myPrintln(age interface{}){
	fmt.Println(age)
}