GO斷言來轉換數據類型

golang的語言中提供了斷言的功能。golang中的所有程序都實現了interface{}的接口,這意味着,所有的類型如string,int,int64甚至是自定義的struct類型都就此擁有了interface{}的接口,這種做法和java中的Object類型比較類似。那麼在一個數據通過func funcName(interface{})的方式傳進來的時候,也就意味着這個參數被自動的轉爲interface{}的類型。

如以下的代碼:

func funcName(a interface{}) string {
     return string(a)
}
編譯器將會返回:

cannot convert a (type interface{}) to type string: need type assertion

此時,意味着整個轉化的過程需要類型斷言。類型斷言有以下幾種形式:

1)直接斷言使用

var a interface{}

fmt.Println("Where are you,Jonny?", a.(string))

但是如果斷言失敗一般會導致panic的發生。所以爲了防止panic的發生,我們需要在斷言前進行一定的判斷

value, ok := a.(string)

如果斷言失敗,那麼ok的值將會是false,但是如果斷言成功ok的值將會是true,同時value將會得到所期待的正確的值。示例:

value, ok := a.(string)
if !ok {
    fmt.Println("It's not ok for type string")
    return
}
fmt.Println("The value is ", value)
另外也可以配合switch語句進行判斷:
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語言編程的小tips

1)如果不符合要求可以儘快的return(return as fast as you can),而減少else語句的使用,這樣可以更加直觀一些。

2)轉換類型的時候如果是string可以不用斷言,使用fmt.Sprint()函數可以達到想要的效果

3)變量的定義和申明可以用組的方式,如:

var (
   a string
   b int
   c int64
   ...
)


import (
    "fmt"
    "strings"
    "net/http"
   ...
)
4) 函數邏輯比較複雜,可以把一些邏輯封裝成一個函數,提高可讀性。

5)使用net/http包和net/url包的函數,可能會帶有url encode功能,需要注意


原文地址

http://blog.csdn.net/jonnyhsu/article/details/41148753







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章