gocron源代碼中的Action那個地方,就是個空介面類型Action interface{},可以傳遞任意類型進去,這裡是傳了個函數進去 介面是合約,任何類型只要實現了介面中的方法,那麼就可以認為實現了這個介面。對於沒有方法的介面interface{}類型,可以看做所有的類型都實現了這個介面,因 ...
gocron源代碼中的Action那個地方,就是個空介面類型Action interface{},可以傳遞任意類型進去,這裡是傳了個函數進去
command := cli.Command{ Name: "web", Usage: "run web server", Action: runWeb, Flags: flags, }
介面是合約,任何類型只要實現了介面中的方法,那麼就可以認為實現了這個介面。對於沒有方法的介面interface{}類型,可以看做所有的類型都實現了這個介面,因此可以作為傳遞參數時傳遞任意類型。
下麵的代碼聲明a是空介面,因此任何類型的數據都可以存進去
var a interface{} a = 1 fmt.Println(a) a = "taoshihan" fmt.Println(a) a = User{Name: "taoshihan"} fmt.Println(a)
作為函數傳參的時候也是可以的,但是當作為返回類型時,有時要進行類型斷言,把類型轉回來才能賦值給別的變數
func test1(str string) interface{} { return str } var b string b = test1("taoshihan").(string) fmt.Println(b)
完整源碼:
package main import "fmt" type User struct { Name string } //空介面作為傳參 func test(a interface{}) { //可以用這個判斷類型 switch a.(type) { case string: fmt.Println(a) } } //空介面作為返回 func test1(str string) interface{} { return str } func main() { //任何類型都能存進去 var a interface{} a = 1 fmt.Println(a) a = "taoshihan" fmt.Println(a) a = User{Name: "taoshihan"} fmt.Println(a) //空介面作為參數 test("taoshihan") //這裡要進行類型斷言,把空介面轉回string var b string b = test1("taoshihan").(string) fmt.Println(b) }