成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Go 語言怎么使用類型轉換和類型斷言?

開發 前端
需要注意的是,使用 switch case? 方式的類型斷言,即便省略 default?,也不會因為不是 ok-idiom? 模式的類型斷言而引發 panic。

01 介紹

Go 語言是強類型編程語言,一些使用弱類型編程語言的讀者朋友們在初學 Go 語言時,多多少少都會不太適應 Go 語言的類型。

Go 語言變量類型包含基礎類型和復合類型,類型轉換和類型斷言一般是對基礎類型的處理,基礎類型包含整數、浮點數、布爾和字符串。

其中整數類型又稱為整型,分為有符合和無符號,各自又包含不同大小,8位、16位、32位和64位,其中 int32 和 uint8 的類型別名分別是 rune和 byte。

浮點數類型分為 float32 和 float64,為了避免精度丟失,一般我們選擇使用 float64,float32 和 float64 之間可以直接轉換,整型和浮點數類型之間也可以直接轉換,需要注意丟失精度的問題。

布爾類型的值只有兩個,分別是 true 和 false,類型零值為 false。需要注意的是它無法像弱類型編程語言可以隱式轉換為 1 和 0。

字符串類型是一組使用雙引號引起來的字節序列,它可以包含任意數據。需要注意的是它不可以改變,因為多個字符串可以共享同一塊內存空間。

本文我們介紹 Go 語言的類型轉換和類型斷言。

02 類型轉換

我們在項目開發時,可能會遇到一些需要類型轉換的場景,比如我們使用 Go 語言開發 Api 接口。

客戶端(調用方)在請求我們使用 Go 語言開發的 Api 接口時,雖然會按照我們預先協商的參數類型,但是隨著項目的不斷迭代,可能以前定義的變量類型需要修改。

因為 Go 語言是強類型語言,不支持類型隱式轉換,我們就需要顯式轉換變量的類型。

Go 語言類型轉換的方式:

強制轉換

整數類型之間可以強制轉換,代碼如下:

func main(){
    var a int64
    a = 1
    fmt.Printf("%T\t%d\n", a, a)
    var b int8
    b = int8(a)
    fmt.Printf("%T\t%d\n", b, b)
}

閱讀上面這段代碼,我們定義 int64 類型的變量 a,使用 <類型>(<數值>) 的格式,直接把變量 a 的由 int64 轉換為 int8 的變量 b。

浮點數類型之間,浮點數和整型之間,也可以強制轉換,代碼如下:

func main(){
    var a float64
    a = 3.1415926
    fmt.Printf("%T\t%f\n", a, a)
    var b float32
    b = float32(a)
    fmt.Printf("%T\t%f\n", b, b)
    var c int64
    c = int64(b)
    fmt.Printf("%T\t%d\n", c, c)
}

閱讀上面這段代碼,我們定義 float64 類型的變量 a,使用 <類型>(<數值>) 的格式,直接把變量 a 由 float64 轉換為 float32 的變量 b,然后變量 b 由 float32 轉換為 int64 的變量 c。需要注意丟失精度的問題。

布爾類型 bool,它的值只有兩個,分別是 true 和 false,它沒有其它類型可以強制轉換,不過可以使用標準庫或三方庫對布爾類型進行類型轉換。

字符串類型是一組使用雙引號引起來的字節序列,所以 string 和 []byte 之間可以強制轉換,代碼如下:

func main(){
    var a string
    a = "golang"
    fmt.Printf("%T\t%s\n", a, a)
    var b []byte
    b = []byte(a)
    fmt.Printf("%T\t%d\n", b, b)
}

閱讀上面這段代碼,我們定義 string 類型的變量 a,使用 <類型>(<數值>) 的格式,直接把變量 a 由 string 轉換為 []byte 的變量 b,反之亦然。

使用標準庫或三方庫

無法強制轉換的類型,可以使用標準庫或三方庫,比如布爾類型,代碼如下:

func main(){
    var a bool
    a = true
    fmt.Printf("%T\t%t\n", a, a)
    var b string
    b = strconv.FormatBool(a)
    fmt.Printf("%T\t%s\n", b, b)
}

閱讀上面這段代碼,我們定義 bool 類型的變量 a,使用 <類型>(<數值>) 的格式,使用標準庫 strconv 的方法把變量 a 由 bool 轉換為 string 的變量 b。

除了標準庫 strconv[1] 之外,標準庫 fmt[2] 也提供了類型轉換的方法;還有一些三方庫,比如 cast[3]。限于篇幅,此處不再詳細贅述,感興趣的讀者朋友們可以閱讀相關文檔了解更多。

03 類型斷言

我們在項目開發時,可能想要定義參數的類型為通用類型,比如我們使用 Go 語言開發 Api 接口。

我們想要盡量適配客戶端(調用方)傳參使用不同類型,比如調用方是使用弱類型編程語言的場景。

我們可以定義變量類型的空接口類型 interface{},然后使用類型斷言,獲取傳參的實際類型,按需處理為我們想要的類型。

示例代碼:

func main(){
    var id interface{}
    id = 1 // 參數 id 接收到的值為整型
    fmt.Printf("%T\t%v\n", id, id)
    // 需要使用字符串類型的變量 id 賦值給字符串類型的變量 uid
    var uid string
    value, ok := id.(string)
    if ok {
        uid = value
    }
    fmt.Printf("%T\t%v\n", uid, uid)
}

閱讀上面這段代碼,我們定義 interface{} 空接口類型的變量 id,作為接收請求參數,實際需要使用字符串類型的數據,我們使用類型斷言檢查變量 id 的值是否是字符串類型,是字符串類型則賦值給變量 uid。

需要注意的是,我們在使用類型斷言時,最好使用 ok-idiom 模式,避免引發 panic。

此外,還有 switch case 方式的類型斷言,也稱為類型選擇。可以處理多種類型,代碼如下:

func main() {
    var id interface{}
    id = 1 // 參數 id 接收到的值為整型
    fmt.Printf("0-%T\t%v\n", id, id)
    // 需要使用字符串類型的變量 id 賦值給字符串類型的變量 uid
    var uid string
    switch val := id.(type) {
    case string:
     uid = val
     fmt.Printf("1-%T\t%v\n", uid, uid)
    case int:
     uid = strconv.Itoa(val)
     fmt.Printf("2-%T\t%v\n", uid, uid)
    default:
     fmt.Printf("3-%T\t%v\n", uid, uid)
    }
}

閱讀上面這段代碼,我們使用 switch case 方式的類型斷言參數 id,如果參數的值是我們需要的類型,則直接使用,反之,則類型轉換之后再使用。

細心的讀者朋友們可能發現該方式的類型斷言格式有所不同,小括號中的數據類型改為 type。

需要注意的是,使用 switch case 方式的類型斷言,即便省略 default,也不會因為不是 ok-idiom 模式的類型斷言而引發 panic。

04 總結

本文我們介紹 Go 語言中讓之前一直使用弱類型編程語言的讀者朋友們迷惑的類型轉換和類型斷言。

讀完本文,大家至少可以區分類型轉換和類型斷言的區別,和了解各自的使用場景。

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2023-10-29 16:18:26

Go接口

2023-06-26 00:03:55

Go語言類型

2024-04-26 00:01:00

Go語言類型

2021-10-03 22:18:14

Go語言整數

2021-07-27 06:06:34

TypeScript語言運算符

2024-05-10 08:04:44

開發者Go語言

2023-01-17 14:01:19

JavaScript類型轉換字符串

2021-04-13 08:42:29

C語言數據類型轉換自動類型轉換

2021-06-01 23:18:00

Golang語言Method

2021-11-14 23:05:28

GoCast語言

2012-12-11 09:16:07

Go

2023-03-20 08:14:11

PHP類型轉換

2022-06-05 23:30:25

AES加密算法

2021-11-23 23:31:43

C語言數據類型系統

2020-08-20 11:50:31

語言類型轉換代碼

2021-10-11 13:25:42

語言Go類型

2021-11-15 10:29:39

Go語言類型

2010-11-15 13:35:28

Oracle記錄類型

2016-12-20 16:35:52

NodeJSC++類型轉換

2024-04-01 00:02:56

Go語言代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区日本 | 久久一区二区视频 | 亚洲成人福利视频 | 成人毛片在线视频 | 日韩三级 | 一区二区三区在线 | 午夜影院操| 精品久久久久一区 | 国产女人叫床高潮大片免费 | 粉嫩一区二区三区国产精品 | 日韩欧美在线精品 | 欧美1区2区 | 国产精品久久久久久久久久久久久 | 日韩视频在线一区 | 一区二区在线不卡 | 亚洲欧美激情精品一区二区 | 草久久| 91在线成人 | 亚洲欧美一区二区三区国产精品 | 日韩视频观看 | 国产在线拍偷自揄拍视频 | 欧美日韩视频 | 久久久久久久久99 | 中文字幕亚洲视频 | 欧美一级免费黄色片 | 欧洲性生活视频 | 午夜电影在线播放 | 午夜影院网站 | 国产欧美一区二区久久性色99 | av一级久久| 一区二区手机在线 | 男人天堂手机在线视频 | 伊人免费视频二 | 国产激情在线观看 | 欧美爱爱视频 | 国内精品久久精品 | 亚洲欧美成人影院 | 91精品国产乱码久久久久久久久 | 精品在线播放 | 亚洲天堂一区二区 | www.色婷婷 |