1. 变量和常量
变量初始化
var v1 int = 10 var v2 = 10 v3 := 10
变量赋值
var v1 int v1 = 10 v2 := 20 v1, v2 = v2, v1 //多重赋值
_, _, name = getName() // 匿名变量
预定义常量
const { // const 关键字将iota初始化为0 v1 = iota v2 = iota // 1 v3 = iota // 2 }
const {
v1 = iota << 1 // 1
v2 // 2 表达式格式一样可省略
v3 // 4
}
const {
SUNDAY = iota
// MONDAY // 枚举类型
// TUESDAY
// WEDNESDAY
// THURSDAY
// FRIDAY
// SATURDAY
}
2. 数据类型
2.1 bool
var v1 bool v1 = true v2 := (1==2) v3 := (1!=0)
2.2 int
var v1 int32 v2 := 10 // v2自动推导为int64类型 v1 = int32(v2) // 赋值给v1前要强制类型转换,否则会报错
两个不同类型整数不能直接做比较,但是可以与字符常量做比较
var v1 int32 = 10 v2 := 10 var v3 bool = (int(v1) > v2)
v4 := v1 > 20 fmt.Print(v1, v2, v3, v4)
位运算
a := 124 << 2 // 496 左移2位 b := 124 >> 2 // 31 c := 124 ^ 2 // 异或 d := 124 & 2 // 与 e := 124 | 2 // 126 g := ^3 // 取反
2.2 字符串
var c string c = "hello 中国" n := len(c) for i := 0; i < n; i++ { ch := c[i] // ch类型位byte fmt.Println(i, ch) } for i, ch := range c { // ch类型位unicode fmt.Println(i, ch, string(ch) }
2.3 数组
var myarr [5]int // 声明数组 myarr = [5]int{1,2,3,4,5} //数组赋值 var arr1 [2*N] struct{x, y int32} // 复杂类型数组 var arr2 [2][3]int 二维整形数组, 2行5列 var arr3 [2][2][2]float32
遍历元素
arr1 := [5]int{1,2,3,4,5} for i := 0; i < len(arr1); i++ { fmt.Printf(arr1[i]) } for index, value := range(arr1){ fmt.Println(index, value) }
值类型
数组是值类型,所有的值类型在赋值或者传递给函数时都会发生一次复制。
package main import "fmt" func modify(array [5]int) { array[0] = 10 } func main() { arr1 := [5]int{1,2,3,4,5} modify(arr1) // 不会改变数组的值 fmt.Print(arr1) }
2.4 数组切片
基于数组创建切片
func main() { var arr1 = [5]int{1,2,3,4,5} var myslice []int = arr1[:5] fmt.Println(myslice) }
利用make函数创建切片
package main import "fmt" func main() { var slice1 = make([]int, 5) var slice2 = make([]int, 5, 10) slice3 := []int{1,2,3,4,5} fmt.Println(slice1, slice2, slice3)
// len(slice2) 5 显示元素个数
// cap(slice2) 10 显示空间大小 }
向数组切片中添加元素
var slice1 = []int var slice2 = []int{1,2,3} slice1 = append(slice1, 1, 2, 3) // 添加元素 slice1 = append(slice1, slice2...) //向数组切片中添加数组切片,...是一个语法糖
内容复制
sli1 := []int{1,2,3} sli2 := []int{4,5,6,7,8,9} copy(sli1, sli2) //将sli2中的元素复制到sli1中
2.5 map数据类型
package main import "fmt" type PersonInfo struct { ID string Name string Address string } func main() { var persons map[string] PersonInfo persons = make(map[string] PersonInfo) persons["zj"] = PersonInfo{"01","zj","209"} val, ok := persons["zj"] if ok { fmt.Println(ok, val) } }