C#/JAVA 程序員轉GO/GOLANG程序員筆記大全(DAY 04)

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

// 定義:
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 接口 多態的應用code

// 多態的應用
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 空接口 (任務類型)blog

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, ...
}
相關文章
相關標籤/搜索