golang是类型后置的语言 `var name string` # 一、类型转换 在Go中,只存在显式的类型转换,**不存在隐式类型转换**,因此不同类型的变量无法进行运算,无法作为参数传递。类型转换适用的前提是知晓被转换变量的类型和要转换成的目标类型,例子如下: ```golang 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时出现数值溢出问题 ```golang var num1 int8 = 1 var num2 int32 = 512 fmt.Println(int32(num1), int8(num2)) //输出 1 0 ``` # 二、类型判断 ```golang var a interface{} = 2 switch a.(type) { case int: fmt.Println("int") case float64: fmt.Println("float") case string: fmt.Println("string") } ``` # 三、类型断言 ```golang 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中,每一个新声明的类型都必须有一个与之对应的基础类型,且类型名称不建议与已有的内置标识符重复 ```golang type MyInt int64 type MyFloat64 float64 type MyMap map[string]int // 可以通过编译,但是不建议使用,这会覆盖原有的类型 type int int64 ```