C#/JAVA 程序员转GO/GOLANG程序员笔记大全,DAY 04

-------------------- interface 接口

// 定义:
type IHumaner interface {
    SayHi()        // 接口中只能是方法声明,没有实现,没有数据字段
}

// Student ...
type Student struct {
    id     int
    name string
}

func (tmp *Student) SayHi() {
    fmt.Println("Student[%s, %d] SayHi", tmp.name, tmp.id)
}

// Teacher ...
type Teacher struct {
    addr  string
    group string
}

func (tmp *Teacher) SayHi() {
    fmt.Println("Teacher[%s, %d] SayHi", tmp.addr, tmp.group)
}

// MyStr
type MyStr string
func (tmp *MyStr) SayHi() {
    fmt.Println("MyStr[%s, %d] SayHi", *tmp)
}

func main() {
    // 定义接口类型的变量
    var i IHumaner
    
    // 只是实现了此接口的方法的类型,那么这个类型的变量(接收者类型)就可以给i赋值
    s := &Student{"loong", 666}
    i = s
    i.SayHi()
    
    t := &Teacher{"cls", "ShenZhen"}
    i = t
    i.SayHi()
    
    var str MyStr = "hello loong"
    i = &str
    i.SayHi()
    
    // Print Result
    // loong 666 ... cls ... hello loong
}

-------------------- interface 接口 多态的应用

// 多态的应用
func WhoSayHi(i IHumaner){
    i.SayHi()
}

// 调用多态
s := &Student{"loong", 666}
t := &Teacher{"cls", "ShenZhen"}
var str MyStr = "hello loong"

WhoSayHi(s)
WhoSayHi(t)
WhoSayHi(&str)

// 创建一个切片
x := make([]IHumaner, 3)
x[0] = s
x[1] = t
x[2] = &str

for _, i := range x {
    i.SayHi()
}

-------------------- interface 空接口 (任务类型)

func main() {
    // 空接口是万能类型
    type tmp interface{} = 1
    // 字符串
    tmp = "abc"
    tmp = &v2
    // .. 等等数据类型    
    
    // ***** 打印参数的内部实现就是采用的空接口
    // ftm.Println(args ...interface{})
}
-------------------- 类型断言 (类型查询)
struct Student struct {
    id      int
    name string
}

func main() {
    i := make([]interface{}, 3)
    i[0] = 1
    i[1] = "hello go"
    i[2] = Student{666, "loong"}
    
    // 类型查询
    for index, data := range i {
        // 第一个返回值,第二个返回判断结果的真假
        if value, ok := data.(int); ok == true {
                
        }
        // data.(string)      data.(Student)  都可以作为判断
    }
    
    // 同理,data.(type) 也可以作用于判断类型 return int, string, ...
}