概述
Go语言将数据类型分为四类:
基础类型:数值类型、字符串、布尔型
复合类型:数组、结构体
引用类型:指针、切片、字典、函数、通道
接口类型
基础类型
- 数值类型
数值类型包括:整形、浮点型、复数
整形分为有符号、无符号类型;int8 int16 int32 int64 uint8 uint16 uint32 uint64
整形还有两种岁CPU平台机器字大小的有符号类型int
和无符号类型uint
(机器是32位则是32位,机器是64位则是64位)。
其中Unicode字符rune
类型和int32
是等价类型,表示一个Unicode码,这两个名字可以互换使用。
byte
也和uint8
等价。
其他类型都需要显示转换,不能直接互换使用。比如int32和int在32位平台都是32位,但不是同一类型。
package main
import (
"fmt"
)
func main() {
var a int32=1
var b rune =1
fmt.Println("a==b:",a==b)//a==b: true
var c byte=1
var d uint8 =1
fmt.Println("c==d:",c==d)//c==d: true
type myint int
var e myint=1
var f int =1
fmt.Println("e==f:",e==f)//invalid operation: e == f (mismatched types myint and int)
var g int64=1
var h int =1
fmt.Println("g==h:",g==h)//invalid operation: g == h (mismatched types int64 and int)
}
超出阈值:
如果超出阈值,就会循环显示,比如int8
的范围是-128~127
,给它值127
,然后+1
,得到的结果将是-128
,反之亦然。
package main
import (
"fmt"
)
func main() {
var a int8=127
a=a+1
fmt.Println(a)//-128
var b int8=-128
b=b-1
fmt.Println(b)//127
}
- 字符串
字符串要区分字符和字节的区别:
Unicode码收集世界上所有的符号,称为字符,对应rune类型。rune和int32等价类型,可以互用。
utf8是将Unicode码编码为字节序列的变长编码。utf8用1~4个字节表示一个Unicode字符。
Go语言的源文件采用UTF8编码,也默认处理uft8。
标准库里面有unicode包支持对rune字符的处理,自行查找。
字符串的处理有四个包特别重要:bytes strings strconv unicode
。后面单独分析。
字符串是一个不可改变的字符序列。
内置的len函数可以返回字符串中的字节数目。
索引s[i]可以返回第i个字节的字节值,i满足0<=i<=len(s)
。 - 布尔型
布尔类型可以和&&
、||
操作符结合,并且可能出现短路行为:如果运算符左侧已经确定了整个布尔表达式的值,那么右侧的值不再被求值。
布尔值不会隐式和数值0\1
相互转换。 - 运算符
* / % << >> & &^
+ - | ^
== != < <= > >=
&&
||
- 常量
常量的潜在类型都是基础类型:布尔值,字符串,数值类型。定义后自动分配类型,且在编译期计算。
iota是常量生成器,默认从0开始,不过最好手动从1开始。
复合类型
值类型的意思是,在函数传递时,是按值传递的。
数组、结构体是聚合类型。
数组是有同种类型的多个元素组成,是值类型。len()可以返回元素个数。
数组的长度也是数组类型的组成部分,所以[3]int和[4]int是不同类型。
数组的长度在编译阶段确定,所以必须是常量表达式。
结构体是有多种不同类型的元素组成,也是值类型。不同结构体属于不同类型。
引用类型
引用类型,是指,多个名字引用同一个实例。一个名字对该实例的修改影响其他名字的引用。
函数传递参数时,也是引用传递,资源损耗很小,是非常重要的手段。
指针、切片、字典、函数、通道
都是引用类型
接口类型也是引用类型,因为他很特殊,所以单独拎出来使用。
切片 slice代表变长的序列。
slice有三部分组成:指针、长度、容量。有一个地方不同就代表不同类型。
len()获取slice的长度,cap()获取slice的容量。
字典 map是哈希表的引用。len()可以获取字典的长度。
结构体一般会和json一起使用。
基础类型和数组大家可以自行了解。其中最主要的类型时:
切片:slice
字典:map
结构体:struct
函数:func
接口:interface
通道:channel
这几种类型单独分析。