跟Java不同点:
1. struct 实现 interface,并没有明显的实现写法,各写各的
2. struct 可以实现部分interface的方法,而不必要全部实现。直接用没问题,用interface进行引用就报错:
示例代码:
// 包路径 package main import "fmt" // 接口有两个方法 type Animal interface { call() getName() string } // 创建类Market,有一个name熟悉 type Market struct { name string } /** 实现方法: 1. (m Market): 标识 这个是Market类的方法 2. call() 接口的方法 */ func (m Market) call() { fmt.Println("market call,", "name:", m.name) } func (m Market) getName() string { return m.name } type Tiger struct { name string } func (t Tiger) call() { fmt.Println("tiger call,", "name:", t.name) } func (t Tiger) getName() string { return t.name } func animalCall(a Animal) { a.call() } // 空接口,可以接受任何类型的对象,并根据类型判断 func print(v interface{}) { switch t := v.(type) { case int: fmt.Println("integer", t) case string: fmt.Println("string", t) } } // main方法 func main() { // 接口 interface m1 := Market{name: "m111"} fmt.Println(m1.getName()) m1.call() m2 := new(Market) m2.name = "m222" m2.call() t1 := Tiger{name: "t1111"} fmt.Println(t1.getName()) t1.call() // 根据传值的不同 animalCall(m1) animalCall(t1) // 定义一个接口,然后复制类对象,按照接口调用就可以 var a1 Animal a1 = m1 a1.call() // 将m1转换为 Market类型 m11 := a1.(Market) fmt.Println(m11.name) // 空接口接受人任何对象 print(11) print("str11") }