Go語言型別強制轉換

2020-07-16 10:04:57
由於 Go語言是強型別的語言,如果不滿足自動轉換的條件,則必須進行強制型別轉換。任意兩個不相干的型別如果進行強制轉換,則必須符合一定的規則。

強制型別的語法格式:var a T = (T) (b),使用括號將型別和要轉換的變數或表示式的值括起來。

非常數型別的變數 x 可以強制轉化並傳遞給型別 T,需要滿足如下任一條件:

1) x 可以直接賦值給 T 型別變數。

2) x 的型別和 T 具有相同的底層型別。

範例程式碼如下所示:
package main
import{
    "fmt"
}
type Map map[string]string

func (m Map) Print() {
    for _, key := range m {
        fmt.Println (key)
    }
}

type iMap Map

//只妥底層型別是 slice、map 等支援 range 的型別字面量,新型別仍然可以使用 range 疊代
func (m iMap) Print() {
    for _, key := range m {
        fmt.Println(key)
    }
}
func main() {
    mp := make(map[string]string, 10)
    mp["hi"] = "tata"
    //mp 與 ma 有相同的底層型別 map[string]stirng,並且 mp 是未命名型別
    var ma Map = mp
    // im 與 ma 雖然有相同的底層型別,但是二者中沒有一個是字面量型別,不能直接賦佳,可以
    // 強制進行型別轉換
    //var im iMap = ma
    var im iMap = (iMap) (ma)
    ma.Print()
    im.Print()
}
3) x 的型別和 T 都是未命名的指標型別,並且指標指向的型別具有相同的底層型別。

4) x 的型別和 T 都是整型,或者都是浮點型。

5) x 的型別和 T 都是複數型別。

6) x 是整數值或 []byte 型別的值, T 是 string 型別。

7) x 是一個字串,T 是 []byte 或 []rune 。

字串和位元組切片之間的轉換最常見,範例如下:

s := "hello, 世界!"
var a []byte
a = []byte(s)
var b string
b = string(a)
var c []rune
c = []rune(s)
fmt.Printf("%Tn", a) //[]uint8 byte 是 int8 的別名
fmt.Printf("%Tn", b) //string
fmt.Printf("%Tn", c) //int32 rune 是 int32 的別名

注意:
  • 數值型別和 string 型別之間的相互轉換可能造成值部分丟失;其他的轉換僅是型別的轉換,不會造成值的改變。string 和數位之間的轉換可使用標準庫 strconv。
  • Go語言沒有語言機制支援指標和 interger 之間的直接轉換,可以使用標準庫中的 unsafe 包進行處理。