2014-02-26 72 views

回答

10

是的。它被稱爲類型開關。它允許您根據您傳遞的接口的實際類型執行代碼。

我認爲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) 
} 
2

它是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" 
相關問題