Go 语言:类型转换


#Go 语言#


不同类型的数字不能直接进行加减乘除

下面的代码编译时会报错:

package main

import "fmt"

func main() {
	var a int8 = 12;
	var b int32 = 10;
	fmt.Println(a+b)  // 会报错
}

编译时报错如下:

# command-line-arguments
./hello.go:8:15: invalid operation: a + b (mismatched types int8 and int32)

正确的写法是先强转为相同的类型,再进行运算:

package main

import "fmt"

func main() {
	var a int8 = 12;
	var b int32 = 10;
	fmt.Println(int32(a)+b)
}

空接口类型变量

对于空接口interface {} 类型的变量,可以使用switch.(type) 配合一起判断类型:

package main

import "fmt"

func main() {
	var a int8 = 12
	var b interface{} = a
    switch b.(type) {
    case int8:
        fmt.Println("int8")
    case int32:
        fmt.Println("int32")
    }
}

运行结果:

int8

对于一个 interface{} 变量,可以用 .(真实类型) 将其转换为真正的具体类型:

package main

import "fmt"

func main() {
	var a int8 = 12
	var b interface{} = a
	c, ok := b.(int8) // 只能转换为 int8
	var d int8 = 10
	if ok {
        fmt.Println(c+d)
    } else {
        fmt.Println("类型转换失败")
    }
}

运行结果:

22

不能转换为其他类型:

package main

import "fmt"

func main() {
	var a int8 = 12
	var b interface{} = a
	c, ok := b.(int32) // 此处转换会失败
	var d int32 = 10
	if ok {
        fmt.Println(c+d)
    } else {
        fmt.Println("类型转换失败")
    }
}

运行结果:

类型转换失败

对于非空接口类型变量,不能用上面的方式进行转换,会编译报错:

package main

import "fmt"

func main() {
	var a int8 = 12
	c, ok := a.(int32) // 编译会报错
	if ok {
		fmt.Println(c)
	} else {
		fmt.Println("类型转换失败")
	}
}

编译时报错如下:

# command-line-arguments
./hello.go:7:12: invalid type assertion: a.(int32) (non-interface type int8 on left)

( 本文完 )