fmt.Printf("os arch %s, int size %d\n", runtime.GOARCH, strconv.IntSize) //int是4字节还是8字节,取决于操作系统是32位还是64位 var a int = 5 var b int8 = 5 var c int16 = 5 var d int32 = 5 var e int64 = 5 var f uint = 5 var g uint8 = 5 var h uint16 = 5 var i uint32 = 5 var j uint64 = 5 fmt.Printf("a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d, j=%d\n", a, b, c, d, e, f, g, h, i, j) var k float32 = 5 var l float64 = 5 fmt.Printf("k=%f, l=%.2f\n", k, l) //%.2f保留2位小数 var m complex128 = complex(4, 7) var n complex64 = complex(4, 7) fmt.Printf("type of m is %T, type of n is %T\n", m, n) //%T输出变量类型 fmt.Printf("m=%v, n=%v\n", m, n) //按值的本来值输出 fmt.Printf("m=%+v, n=%+v\n", m, n) //在 %v 基础上,对结构体字段名和值进行展开 fmt.Printf("m=%#v, n=%#v\n", m, n) //输出 Go 语言语法格式的值 fmt.Printf("m的实部%f, m的虚部%f\n", real(m), imag(m)) fmt.Printf("m的实部%e, m的虚部%g\n", real(m), imag(m)) //%e科学计数法,%g根据实际情况采用%e或%f格式(以获得更简洁、准确的输出) o := true//等价于var o bool = true fmt.Printf("o=%t\n", o) //%t布尔变量 var pointer unsafe.Pointer = unsafe.Pointer(&a) var p uintptr = uintptr(pointer) var ptr *int = &a fmt.Printf("p=%x pointer=%p ptr=%p\n", p, pointer, ptr) //%p输出地址,%x十六进制 var q byte = 100//byte是uint,取值范围[0,255] fmt.Printf("q=%d, binary of q is %b\n", q, q) //%b输出二进制 var r rune = '☻'//rune实际上是int32,即可以表示2147483647种字符,包括所有汉字和各种特殊符号 fmt.Printf("r=%d, r=%U\n", r, r) //%U Unicode 字符 var s string = "I'm 张朝阳" fmt.Printf("s=%s\n", s) var t error = errors.New("my error") fmt.Printf("error is %v\n", t) fmt.Printf("error is %+v\n", t) //在 %v 基础上,对结构体字段名和值进行展开 fmt.Printf("error is %#v\n", t) //输出 Go 语言语法格式的值
var a int var b byte var f float32 var t bool var s string var r rune var arr [3]int var slc []int
fmt.Printf("default value of int %d\n", a) fmt.Printf("default value of byte %d\n", b) fmt.Printf("default value of float %.2f\n", f) fmt.Printf("default value of bool %t\n", t) fmt.Printf("default value of string [%s]\n", s) fmt.Printf("default value of rune %d, [%c]\n", r, r) fmt.Printf("default int array is %v\n", arr) //取每个元素对应类型的默认值 fmt.Printf("default slice is nil %t\n", slc == nil)
//输出 default value of int0 default value of byte0 default value of float 0.00 default value of boolfalse default value of string [] default value of rune0, [] defaultint array is [000] default slice is niltrue
复合数据类型
类型
默认值
说明
array
取每个元素对应类型的默认值
值类型
struct
取每个成员变量对应类型的默认值
值类型
string
“”
UTF-8 字符串
slice
nil
引用类型
map
nil
引用类型
channel
nil
引用类型
interface
nil
接口
function
nil
函数
自定义类型
类型别名
1 2 3
typebyte = uint8 typerune = int32 type semaphore = uint8
自定义类型
1 2 3 4
type user struct {name string;age int} //用分号把多行代码隔开 type signal uint8 type ms map[string]string type add func(a, b int)int
var arr1 [5]int = [5]int{} //数组必须指定长度和类型,且长度和类型指定后不可改变 var arr2 = [5]int{} var arr3 = [5]int{3, 2} //给前2个元素赋值 var arr4 = [5]int{2: 15, 4: 30} //指定index赋值 var arr5 = [...]int{3, 2, 6, 5, 4}//根据{}里元素的个数推断出数组的长度 var arr6 = [...]struct { name string age int }{{"Tom", 18}, {"Jim", 20}} //数组的元素类型由匿名结构体给定
二维数组初始化
1 2 3 4
//5行3列,只给前2行赋值,且前2行的所有列还没有赋满 var arr1 = [5][3]int{{1}, {2, 3}} //第1维可以用...推测,第2维不能用... var arr2 = [...][3]int{{1}, {2, 3}}
访问数组里的元素
通过index访问
首元素 arr[0]
末元素 arr[len(arr)-1]
访问二维数组里的元素
位于第三行第四列的元素 arr[2][3]
遍历数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//遍历数组里的元素 for i, ele := range arr { fmt.Printf("index=%d, element=%d\n", i, ele) } //或者这样遍历数组 for i := 0; i < len(arr); i++ { //len(arr)获取数组的长度 fmt.Printf("index=%d, element=%d\n", i, arr[i]) } //遍历二维数组 for row, array := range arr { //先取出某一行 for col, ele := range array { //再遍历这一行 fmt.Printf("arr[%d][%d]=%d\n", row, col, ele) } }
通过for range遍历数组时取得的是数组里每一个元素的拷贝。
1 2 3 4 5 6 7 8 9 10
arr := [...]int{1, 2, 3} for i, ele := range arr { //ele是arr中元素的拷贝 arr[i] += 8//修改arr里的元素,不影响ele fmt.Printf("%d %d %d\n", i, arr[i], ele) ele += 1//修改ele不影响arr fmt.Printf("%d %d %d\n", i, arr[i], ele) } for i := 0; i < len(arr); i++ { fmt.Printf("%d %d\n", i, arr[i]) }
var err error var i int = 8 var i64 int64 = int64(i) //int转string var s string = strconv.Itoa(i) //内部调用FormatInt s = strconv.FormatInt(i64, 10) //string转int i, err = strconv.Atoi(s) //string转int64 i64, err = strconv.ParseInt(s, 10, 64)
//float转string var f float64 = 8.123456789 s = strconv.FormatFloat(f, 'f', 2, 64) //保留2位小数 fmt.Println(s) //string转float f, err = strconv.ParseFloat(s, 64)
//string<-->[]byte var arr []byte = []byte(s) s = string(arr)
//string<-->[]rune var brr []rune = []rune(s) s = string(brr)
fmt.Printf("err %v\n", err)
map
go map的底层实现是hash table,根据key查找value的时间复杂度是O(1)。
map的初始化
1 2 3 4
var m map[string]int//声明map,指定key和value的数据类型 m = make(map[string]int) //初始化,容量为0 m = make(map[string]int, 200) //初始化,容量为5。强烈建议初始化时给一个合适的容量,减少扩容的概率 m = map[string]int{"语文": 0, "数学": 39} //初始化时直接赋值
添加和删除key
1 2 3
m["英语"] = 59//往map里添加key-value对 m ["英语"] = 70//会覆盖之前的值 delete(m, "数学") //从map里删除key-value对
//遍历map for key, value := range m { fmt.Printf("%s=%d\n", key, value) } fmt.Println("-----------") //多次遍历map返回的顺序是不一样的,但相对顺序是一样的,因为每次随机选择一个开始位置,然后顺序遍历 for key, value := range m { fmt.Printf("%s=%d\n", key, value) } fmt.Println("-----------")
//一边遍历一边修改 for key, value := range m { m[key] = value + 1 } for key, value := range m { fmt.Printf("%s=%d\n", key, value) } fmt.Println("-----------")
//for range取得的是值拷贝 for _, value := range m { value = value + 1 } for key, value := range m { fmt.Printf("%s=%d\n", key, value) }