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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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类型无法被stringbool类型代表,因为也就无法进行类型转换。

在数字的类型转换中,通常建议小转大,而不建议大转小,例当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