我看到這個代碼的幾個實例在golang:在交換機中使用時,關鍵字類型的含義是什麼?
func process(node ast.Node) Foo {
switch n := node.(type) {
// ... removed for brevity
}
}
ast.Node
是一個接口。是node.(type)
代碼片段執行反射;找出接口的實際實現者?
我看到這個代碼的幾個實例在golang:在交換機中使用時,關鍵字類型的含義是什麼?
func process(node ast.Node) Foo {
switch n := node.(type) {
// ... removed for brevity
}
}
ast.Node
是一個接口。是node.(type)
代碼片段執行反射;找出接口的實際實現者?
是的。它被稱爲類型開關。它允許您根據您傳遞的接口的實際類型執行代碼。
我認爲the official documentation,以其例如,很清楚:
的開關也可以被用於發現的動態類型的接口 可變的。這種類型的開關在括號內使用類型斷言的語法和 關鍵字類型。如果開關在表達式中聲明瞭 變量,則該變量在每個子句中將具有相應的 類型。在這種情況下重用名稱也是習慣用法,實際上在每種情況下聲明一個具有相同名稱的新變量,但不同類型的變量爲 。
var t interface{}
t = functionOfSomeType()
switch t := t.(type) {
default:
fmt.Printf("unexpected type %T", t) // %T prints whatever type t has
case bool:
fmt.Printf("boolean %t\n", t) // t has type bool
case int:
fmt.Printf("integer %d\n", t) // t has type int
case *bool:
fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool
case *int:
fmt.Printf("pointer to integer %d\n", *t) // t has type *int
}
你不應該使用的正確類型的程序過於頻繁,但它的方便,當你需要它。使用示例:假設您實施數據庫驅動程序,您可能必須根據Go變量的類型進行轉換。這裏的an extract of the go-sql/mysql driver:
// Scan implements the Scanner interface.
// The value type must be time.Time or string/[]byte (formatted time-string),
// otherwise Scan fails.
func (nt *NullTime) Scan(value interface{}) (err error) {
if value == nil {
nt.Time, nt.Valid = time.Time{}, false
return
}
switch v := value.(type) {
case time.Time:
nt.Time, nt.Valid = v, true
return
case []byte:
nt.Time, err = parseDateTime(string(v), time.UTC)
nt.Valid = (err == nil)
return
case string:
nt.Time, err = parseDateTime(v, time.UTC)
nt.Valid = (err == nil)
return
}
nt.Valid = false
return fmt.Errorf("Can't convert %T to time.Time", value)
}
它是TYPE SWITCH:
的開關也可以被用於發現的動態類型的接口 可變的。這種類型的開關在括號內使用類型斷言的語法和 關鍵字類型。如果開關在表達式中聲明瞭 變量,則該變量在每個子句中將具有相應的 類型。在這種情況下重用名稱也是習慣用法,實際上在每種情況下聲明一個具有相同名稱的新變量,但不同類型的變量爲 。
與一種類型的開關,就可以在一個接口值(只)的類型進行切換:
func do(v interface{}) string {
switch u := v.(type) {
case int:
return strconv.Itoa(u*2) // u has type int
case string:
mid := len(u)/2 // split - u has type string
return u[mid:] + u[:mid] // join
}
return "unknown"
}
do(21) == "42"
do("bitrab") == "rabbit"
do(3.142) == "unknown"