真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

golang中的斷言是什么意思

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

英吉沙網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

Go語言里面有一個語法,可以直接判斷是否是該類型的變量: value, ok = element.(T),這里value就是變量的值,ok是一個bool類型,element是interface變量,T是斷言的類型。

如果element里面確實存儲了T類型的數(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 }

常見的還有用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 }

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

如以下的代碼:

func funcName(a interface{}) string {
     return string(a)
}

編譯器將會返回:

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

此時,意味著整個轉(zhuǎn)化的過程需要類型斷言。類型斷言有以下幾種形式:

直接斷言使用

var a interface{}
fmt.Println("Where are you,Jonny?", a.(string))

但是如果斷言失敗一般會導(dǎo)致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)轉(zhuǎn)換類型的時候如果是string可以不用斷言,使用fmt.Sprint()函數(shù)可以達到想要的效果。

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

var (
   a string
   b int
   c int64
   ...
)
import (
    "fmt"
    "strings"
    "net/http"
   ...
)

(4)函數(shù)邏輯比較復(fù)雜,可以把一些邏輯封裝成一個函數(shù),提高可讀性。

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

看完上述內(nèi)容,你們對golang中的斷言有進一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。


名稱欄目:golang中的斷言是什么意思
分享URL:http://weahome.cn/article/ppdedc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部