型別轉換
無論是動態語言或靜態語言,資料型別的轉換都是基本的操作。在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
}