You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.3 KiB
2.3 KiB
golang是类型后置的语言 var name string
一、类型转换
在Go中,只存在显式的类型转换,不存在隐式类型转换,因此不同类型的变量无法进行运算,无法作为参数传递。类型转换适用的前提是知晓被转换变量的类型和要转换成的目标类型,例子如下:
type MyFloat64 float64
var f1 MyFloat64
var f float64
f1 = 0.2
f = 0.1
fmt.Println(float64(f1) + f)
通过显式的将MyFloat64
转换为float64
类型,才能进行加法运算。类型转换的另一个前提是:被转换类型必须是可以被目标类型代表的(Representability),例如int
可以被int64
类型所代表,也可以被float64
类型代表,所以它们之间可以进行显式的类型转换,但是int
类型无法被string
和bool
类型代表,因为也就无法进行类型转换。
在数字的类型转换中,通常建议小转大,而不建议大转小,例:当int32转为int8时出现数值溢出问题
var num1 int8 = 1
var num2 int32 = 512
fmt.Println(int32(num1), int8(num2))
//输出
1 0
二、类型判断
var a interface{} = 2
switch a.(type) {
case int: fmt.Println("int")
case float64: fmt.Println("float")
case string: fmt.Println("string")
}
三、类型断言
var b int = 1
var a interface{} = b
//intVal 表示转换后的值,ok表示转换结果的布尔值
if intVal, ok := a.(int); ok {
fmt.Println(intVal)
} else {
fmt.Println("error type")
}
由于interface{}
是空接口类型,空接口类型可以代表所有的类型,但是int
类型无法代表interface{}
类型,所以无法使用类型转换。而类型断言就可以判断其底层类型是否为想要的类型,类型断言语句有两个返回值,一个是类型转换过后的值,另一个是转换结果的布尔值
四、自定义类型
通过type
关键字声明了一个基础类型为int64
名为MyInt
的类型。在Go中,每一个新声明的类型都必须有一个与之对应的基础类型,且类型名称不建议与已有的内置标识符重复
type MyInt int64
type MyFloat64 float64
type MyMap map[string]int
// 可以通过编译,但是不建议使用,这会覆盖原有的类型
type int int64