不同类型的数字不能直接进行加减乘除
下面的代码编译时会报错:
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)