您好,登錄后才能下訂單哦!
golang中的斷言是什么意思?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Go語言里面有一個語法,可以直接判斷是否是該類型的變量: value, ok = element.(T),這里value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。
如果element里面確實存儲了T類型的數值,那么ok返回true,否則返回false。
package main import ( "fmt" ) type Order struct { ordId int customerId int callback func() } func main() { var i interface{} i = Order{ ordId: 456, customerId: 56, } value, ok := i.(Order) if !ok { fmt.Println("It's not ok for type Order") return } fmt.Println("The value is ", value) }
輸出:
The value is {456 56 <nil>}
常見的還有用switch來斷言:
package main import ( "fmt" ) type Order struct { ordId int customerId int callback func() } func main() { var i interface{} i = Order{ ordId: 456, customerId: 56, } switch value := i.(type) { case int: fmt.Printf("It is an int and its value is %d\n", value) case string: fmt.Printf("It is a string and its value is %s\n", value) case Order: fmt.Printf("It is a Order and its value is %v\n", value) default: fmt.Println("It is of a different type") } }
輸出:
It is a Order and its value is {456 56 <nil>}
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
此時,意味著整個轉化的過程需要類型斷言。類型斷言有以下幾種形式:
直接斷言使用
var a interface{} fmt.Println("Where are you,Jonny?", a.(string))
但是如果斷言失敗一般會導致panic的發(fā)生。所以為了防止panic的發(fā)生,我們需要在斷言前進行一定的判斷。
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功能,需要注意。
看完上述內容,你們對golang中的斷言有進一步的了解嗎?如果還想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。