golang中的斷言是什么意思?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

英吉沙網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站開(kāi)發(fā)等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
Go語(yǔ)言里面有一個(gè)語(yǔ)法,可以直接判斷是否是該類(lèi)型的變量: value, ok = element.(T),這里value就是變量的值,ok是一個(gè)bool類(lèi)型,element是interface變量,T是斷言的類(lèi)型。
如果element里面確實(shí)存儲(chǔ)了T類(lèi)型的數(shù)值,那么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>}常見(jiàn)的還有用switch來(lái)斷言:
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的語(yǔ)言中提供了斷言的功能。golang中的所有程序都實(shí)現(xiàn)了interface{}的接口,這意味著,所有的類(lèi)型如string,int,int64甚至是自定義的struct類(lèi)型都就此擁有了interface{}的接口,這種做法和java中的Object類(lèi)型比較類(lèi)似。那么在一個(gè)數(shù)據(jù)通過(guò)func funcName(interface{})的方式傳進(jìn)來(lái)的時(shí)候,也就意味著這個(gè)參數(shù)被自動(dòng)的轉(zhuǎn)為interface{}的類(lèi)型。
如以下的代碼:
func funcName(a interface{}) string {
return string(a)
}編譯器將會(huì)返回:
cannot convert a (type interface{}) to type string: need type assertion此時(shí),意味著整個(gè)轉(zhuǎn)化的過(guò)程需要類(lèi)型斷言。類(lèi)型斷言有以下幾種形式:
直接斷言使用
var a interface{}
fmt.Println("Where are you,Jonny?", a.(string))但是如果斷言失敗一般會(huì)導(dǎo)致panic的發(fā)生。所以為了防止panic的發(fā)生,我們需要在斷言前進(jìn)行一定的判斷。
value, ok := a.(string)
如果斷言失敗,那么ok的值將會(huì)是false,但是如果斷言成功ok的值將會(huì)是true,同時(shí)value將會(huì)得到所期待的正確的值。示例:
value, ok := a.(string)
if !ok {
fmt.Println("It's not ok for type string")
return
}
fmt.Println("The value is ", value)另外也可以配合switch語(yǔ)句進(jìn)行判斷:
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
}另外補(bǔ)充幾個(gè)go語(yǔ)言編程的小tips:
(1)如果不符合要求可以盡快的return(return as fast as you can),而減少else語(yǔ)句的使用,這樣可以更加直觀(guān)一些。
(2)轉(zhuǎn)換類(lèi)型的時(shí)候如果是string可以不用斷言,使用fmt.Sprint()函數(shù)可以達(dá)到想要的效果。
(3)變量的定義和申明可以用組的方式,如:
var (
a string
b int
c int64
...
)
import (
"fmt"
"strings"
"net/http"
...
)(4)函數(shù)邏輯比較復(fù)雜,可以把一些邏輯封裝成一個(gè)函數(shù),提高可讀性。
(5)使用net/http包和net/url包的函數(shù),可能會(huì)帶有url encode功能,需要注意。
看完上述內(nèi)容,你們對(duì)golang中的斷言有進(jìn)一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
文章名稱(chēng):golang中的斷言是什么意思
分享路徑:http://chinadenli.net/article12/ppdedc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、服務(wù)器托管、動(dòng)態(tài)網(wǎng)站、、網(wǎng)站改版、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)