型別轉換

無論是動態語言或靜態語言,資料型別的轉換都是基本的操作。在Go語言中資料型別是不會自動轉換,需手動進行資料型別的轉換。

go語言中字串和數字之間的轉換,可以使用到go的套件"strconv"

強制轉換

  • 不支持隐式轉換,只支援顯式轉換
  • 轉換只能發生在互相兼容的的型別之間,否則編譯時會出錯
  • float(i)、int(f)
    var a byte = 10
    //var n int = a //cannot use a (type byte) as type int in assignment
    var n int = int(a)
    fmt.Println(n)

    a := 0x1234
    b := 1234.56
    c := 256

    fmt.Printf("%x\n", uint8(a))   //34
    fmt.Printf("%d\n", int(b))     //1234
    fmt.Printf("%f\n", float64(c)) //256.000000

數字轉字串

    var str1 string
    var i int = 10
    fmt.Printf("%T %v", i, i) //int 10

    // 通過Itoa轉換
    str1 = strconv.Itoa(i)
    fmt.Printf("%T %v", str1, str1) //string 10

    // 通過Sprintf轉換
    str2 := fmt.Sprintf("%d", i)
    fmt.Printf("%T %v", str2, str2) //string 10

字串轉數字

    var (
        err error
        s1  string = "5"
        s2  string = "abc"
        i1  int
    )

    i1, err = strconv.Atoi(s1)
    fmt.Printf("%T %v \n", i1, i1) //int 5

    _, err = strconv.Atoi(s2)
    if err != nil {
        // 若發生錯誤
        fmt.Printf("%s\n", err.Error()) //strconv.ParseInt: parsing "abc": invalid syntax
    }

struct轉換

package main

import (
    "fmt"
)

type foo struct {
    i int
}

type bar foo

func main() {
    var b bar = bar{1}
    var f foo = foo(b)

    fmt.Printf("%T %v \n", b, b) // main.bar {1}
    fmt.Printf("%T %v \n", f, f) // main.foo {1}
}

interface

錯誤的類型断言,在編譯時不會出現錯誤,在執行時,系統內部會檢測到型別不同,就會調用內置的panic()函數,拋出一個異常

package main

import "fmt"

func test(i interface{}) {
    fmt.Println(i.(int))
}

func main() {
    var i interface{} = "99"
    test(i)
}
//panic: interface conversion: interface is string, not int

將上個例子改成var i interface{} = 8,就不會出現異常

package main

import "fmt"

func test(i interface{}) {
    fmt.Println(i.(int)) 
}

func main() {
    var i interface{} = 99
    test(i) //99
}

上述為不安全的断言,安全的断言類型,應該增加型別判斷

package main

import "fmt"

func test(i interface{}) {
    switch i.(type) {
    default:
        fmt.Printf("unexpected type %T", i)
    case int:
        fmt.Println(i.(int))
    case string:
        fmt.Println(i.(string))
    }
}

func main() {
    var i1 interface{} = 99
    test(i1) //99
    var i2 interface{} = "abc"
    test(i2) //abc
    var i3 interface{} = 99.999
    test(i3) //unexpected type float64
}