目录
前言✨
前段时间忙着春招面试,现在也算告一段落,找到一家比较心仪的公司实习,开始慢慢回归状态,这后面几章我会学习go1.19版本的语言特性或者机制:类型系统、接口、断言以及反射的内容,也算是补上之前没有深入底层的内容。
个人博客:https://linzyblog.netlify.app/
一、什么是类型?
类型的概念在不同的编程语言之间是不同的,可以用许多不同的方式来表达,但都有一些相同点。
- 类型是用来定义变量、常量、函数参数、函数返回值等值的属性;
- 在定义的变量上可以执行一组操作,例如:int 类型可以执行 + 和 - 等运算,而对于 string 类型,可以执行连接、空检查等操作;
在Go语言中,类型是用来描述变量、常量、函数参数、函数返回值等值的属性。
它定义了变量或表达式可以存储的数据类型,以及可以对其执行的操作。
Go语言中的类型可以分为基本数据类型和引用类型两种。基本数据类型包括整型、浮点型、布尔型、字符串型等,而引用类型包括数组、切片、结构体、接口、channel等。
类型 | 说明 | 例子 |
---|---|---|
布尔型 | 表示真或假的值 | true, false |
整型 | 表示整数的值,有不同的位数和符号 | int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64 |
浮点型 | 表示小数的值,有不同的精度 | float32, float64 |
复数型 | 表示复数的值,由两个浮点数表示实部和虚部 | complex64, complex128 |
字符串型 | 表示文本的值,使用UTF-8编码 | string |
数组型 | 表示固定长度的元素序列,元素类型相同 | [3]int, [5]string |
切片型 | 表示可变长度的元素序列,元素类型相同 | []int, []string |
映射型 | 表示键值对的集合,键类型和值类型可以不同 | map[string]int, map[int]bool |
结构体型 | 表示一组有名字的字段,字段类型可以不同 | struct {name string; age int} |
接口型 | 表示一组方法的集合,用于实现多态和抽象 | interface {Read() error; Write() error} |
函数型 | 表示一段可执行的代码,可以有参数和返回值 | func(int) int, func(string) (string, error) |
通道型 | 表示用于在不同协程之间传递数据的管道,数据类型相同 | chan int, chan string |
这些都是 Go 语言的内置类型,给内置类型和接口定义方法是错误的,哪怕用类型别名也一样。
二、类型特性
1、静态类型检查
Go语言是一种静态类型的编程语言,这意味着每个变量都有一个明确的类型,不能随意改变。
类型具有静态类型检查的特性,这意味着在编译时就能够检查出类型错误,避免了在运行时出现类型不匹配的错误。
这种特性可以提高程序的可靠性和稳定性,减少调试和修复错误的时间和成本。
例如,如果一个函数需要接收一个整型参数,但是在调用该函数时传入了一个字符串类型的参数。
func IntToString(n int) {
fmt.Println("IntToString")
}
func main() {
var n string
IntToString(n)
}
我们编译一下:
➜ interfaceTest (main) ✗ go build ./main.go
# command-line-arguments
./main.go:13:14: cannot use n (variable of type string) as type int in argument to IntToString
编译器就会在编译时发现这个错误,并提示开发者进行修改。这样就可以避免在运行时出现类型不匹配的错误,提高了程序的可靠性。
2、类型推断
类型推断可以根据变量的值自动推断出其类型,简化了代码的书写。这种特性可以让开发者在不显式指定变量类型的情况下,编写更加简洁、易读的代码。
例如,可以使用以下代码声明一个整型变量:
var x int = 10 // 显式地声明x为int类型,并赋值为10
y := 20 // 语法糖,隐式地声明y为int类型,并赋值为20