標籤:結構 blog efault case port name 寫法 switch inf
package main;import "fmt"//介面interface//介面是一個或多個方法簽名的集合//只要某個類型擁有該介面的所有方法簽名,即算實現該介面。//介面只有方法聲明,沒有實現,沒有資料欄位//介面可以匿名嵌入其它介面,或嵌入到結構中。//GO語言中的所有類型都實現了空介面type Empty interface {}type Inf interface {getName() string;setName(name string);}type InfB interface {//這裡把INF介面嵌入Inf;getAge() int;setAge(age int);}type A struct {name string;}type B struct {name string;age int;}//結構A實現Inf的介面func (a *A) getName() string {return a.name;}func (a *A) setName(name string) {a.name = name;}//結構B實現InfB的介面func (b *B) getName() string {return b.name;}func (b *B) setName(name string) {b.name = name;}func (b *B) getAge() int {return b.age;}func (b *B) setAge(age int) {b.age = age;}//函數test接收一個INF類型的變數func test(i Inf) {fmt.Println("ok");}//這裡使用空介面類型接收參數func test2(e Empty) {//判斷屬於哪個介面if a, ok := e.(Inf); ok {fmt.Println(a, "inf");} else if a, ok := e.(InfB); ok {fmt.Println(a, "infb")}}//同上,另一種寫法func test3(e Empty) {switch a := e.(type) {case Inf:fmt.Println(a, "inf");case InfB:fmt.Println(a, "infb");default:fmt.Println(a, "no");}}func main() {a := A{};a.setName("test");fmt.Println(a, a.getName());//注意這裡需要用取地址符,因為上面的方法綁定都是(a *A)test(&a);test2(&a);test3(&a);b := B{};b.setName("testb");b.setAge(25);fmt.Println(b.getName(), b.getAge());//結構B實現了Inf和InfB兩個介面test(&b);test2(&b);test3(&b);//介面InfB可以轉化為Inf,但Inf不能轉化為InfB//只能從超集向子集轉c := B{};//注意這裡要傳地址var d Inf = Inf(&c);d.setName("testc");fmt.Println(d, d.getName());}
go語言中的介面interface