内置数据类型
布尔类型
bool
// Type.go package main
import ( "fmt" )
func main() { var isGirl bool //声明bool类型变量isGirl isGirl = true //isGirl赋值为true isGirl = false //isGirl赋值为false if isGirl { fmt.Println("You are a girl!") } else { fmt.Println("You are a boy!") } }
bool类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
整型
- int8
- byte
- int16
- int
- uint
- uintptr
- int和int32被认为是两种不同的类型,编译器不会做隐式类型转换
- 两个不同类型的整型数不能直接比较,会有编译错误,如int32 和int64类型变量不能比较
##浮点类型
- float32 等价于C语言的float类型
- float64 等价于C语言的double类型
- 声明变量时如果使用类型自动推导,则浮点类型自动设为float64。如 fvar := 12.0 // 此时fvar变量类型为float64
复数类型
complex64
complex128
var value1 complex64 //由2个float32构成的复数 value1 = 3.2 + 12i value2 := 3.2 + 12i //由2个float64构成的complex128类型 value3 := complex(3.2, 12) //同value2
字符串
string
var str string //声明一个字符串变量 str = "Hello World!" // 字符串赋值,注意字符串初始化后不能被修改 ch := str[0] // 取字符串第一个字符 fmt.Printf("The length of \"%s\" is %d\n", str, len(str)) //使用len内置函数计算字符串长度 fmt.Printf("The first character of \"%s\" is %c.\n", str, ch) //Printf函数用法与C语言printf一致 var strA string = "Hello " var strB string = "Go!" var hiGo string = strA + strB //字符串拼接 fmt.Printf("\"%s\" + \"%s\" = \"%s\"", strA, strB, hiGo) n := len(hiGo) for i := 0; i < n; i++ { // 字符串遍历 ch := hiGo[i] fmt.Println(i, ch) }
字符类型
- rune 代表单个Unicode字符
错误类型
- error
指针
- pointer
数组
array
var byteArray [32]byte //长度为32的byte数组,每个元素为一个字节 byteArray[0] = 'a' fmt.Println("byteArray values:", byteArray) var twoDimension [3][5]int // 二维数组 twoDimension[0][0] = 10 fmt.Println("twoDimension values:", twoDimension) //使用range遍历数组,range第一个返回值为元素下标,第二个返回值为元素值 for i, v := range byteArray { fmt.Println("byteArray element[", i, "]=", v) }
- 可以使用len函数计算数组长度,len(array)
- 数组为值类型,即赋值和参数传递时将产生一次复制动作
切片
slice
func sliceDefineDemo() { var myArray [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} //基于已存在的数组创建切片 var mySlice []int = myArray[:5] //取数组的前5个元素 mySlice = myArray[:] //取数组的全部元素 mySlice = myArray[5:] //取从第5个元素开始所有元素 fmt.Print(mySlice) //直接创建数组切片,不需要依赖数组 mySlice1 := make([]int, 5) //创建初始元素个数为5的数组切片,元素初始值为0 mySlice2 := make([]int, 5, 10) //创建初始元素个数为5的数组切片,元素初始值为0,并预留10个元素的存储空间 mySlice3 := []int{1, 2, 3, 4, 5} //直接创建并初始化包含5个元素的数组切片 fmt.Print(mySlice1) fmt.Print(mySlice2) fmt.Print(mySlice3) //根据数组切片创建数组切片 oldSlice := []int{1, 2, 3, 4, 5} newSlice := oldSlice[:3] //基于oldSlice前3个元素构建新数组切片 fmt.Print(newSlice) }
func sliceOptDemo() { mySlice := make([]int, 5, 10) fmt.Println("len(mySlice):", len(mySlice)) //获取切片当前长度 fmt.Println("cap(mySlice):", cap(mySlice)) //获取切片分配的存储空间 mySlice = append(mySlice, 1, 2, 3) //给mySlice加上3个元素,这里重新生成了一个数组切片 mySlice2 := []int{8, 9, 10} mySlice = append(mySlice, mySlice2...) //给mySlice加上另一个数组切片 slice1 := []int{1, 2, 3, 4, 5} slice2 := []int{5, 4, 3} copy(slice2, slice1) //只会复制slice1的前3个元素到slice2中 fmt.Println("slice2: ", slice2) copy(slice1, slice2) //只会复制slice2的前3个元素slice1的前3个位置 fmt.Println("slice1: ", slice1) }
- 直接定义数组切片与定义数组的区别是否指定长长度,指定长度为定义数组,不指定长度为定义切片
- 切片的遍历方式同数组
- 切片长度超过当前分配的存储空间时会自动分配一块足够大的内存
字典
map
func mapDemo() { var scoreMap map[string]int // 声明scoreMap变量,存储学生的分数 scoreMap = make(map[string]int) //创建scroreMap //scoreMap = make(map[string]int, 100) //创建scroreMap,第二个参数为map的存储空间 /*创建并初始化map scoreMap = map[string] int{ "ZhangSan":60, "LiSi":100 } */ //Map中插入数据 scoreMap["ZhangSan"] = 60 scoreMap["LiSi"] = 100 //删除数据 delete(scoreMap, "ZhangSan") //如果该成员不存在,没有副作用 //查找LiSi的分数 studentScore, isFound := scoreMap["LiSi"] if isFound { fmt.Printf("Found LiSi's score: %d", studentScore) } }
通道
- chan
结构体
- struct
接口
- interface