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.

59 lines
2.3 KiB

2 years ago
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
```