12,函数指针,指针函数
函数指针:一个指针。指向函数的指针。函数默认就是指针类型。还有slice,map, function
指针函数:一个函数。函数的返回值是指针。
把指针用做参数。调用之后会修改原值。与值传递不同。
用途:指针用于值传递类型。slice,map等本身就是指针,就无需再使用。
11,指针,指针数组,数组指针
10,函数
defer:延迟到最后执行。主函数所有执行完毕再执行。
例如:文件打开。defer close(); 对象关闭,临时文件删除。
多个defer函数调用,是栈结构。先进后出。
如果发生传递参数,则以传进去时为准,后面变化跟传进去时没有关系了。
defer函数调用后,才是panic或才是return。
传参
值传递:基本数据类型,array,struct。复制一份副本。注意
引用传递:slice,map,channel。参数指向同一块内容。
可变参数:是切片。func getSum(nums ... int) {} 调用:getSum(1,2,3)
s1 := []int{1, 2, 3}; getSum(s1...)
返回值:getSum() (sum int) {}
多返回值
9,array,slice和map
map,跟js的对象很像。但这一组key和value的值是相同的。不能混搭。
var map1 map[int]string //没有初始化,是nil,无法直接使用 map1 == nil //true
var map2 = make(map[int]string) // 盘子里没饺子 map1 == nil // false
var map3 = map[key类型]value类型{key: valule} // 盘子里有饺子 map1 == nil // false
value, ok := map[key]
ok 可以判断key是否存在。
if ok { //对应的值
} else { //不存在key }
len(map) // key的个数
delete key存在删除,key不存在则不影响
循环:用for range,如果想排序,可以借助slice。sort.Ints(keys), sort.Strings(s1),按字符串编码排序
array和slice的区别
数组的长度固定,数组是值类型(值类型有基本数据类型,结构体类型),slice的值长度可变,属于引用类型(引用类型:字典类型,通道类型,函数类型)切片是引用传递,所以它们不需要使用额外的内存并且比使用数组更有效率。
如果传递的是引用类型,那么就是“传引用”,如果传递的是值类型,那么就是“传值”(会把以前的数据复制一遍)
数组长度在声明的时候就必须给定,并且之后不会再改变。
slice类型的字面量中只有元素类型,没有长度。切片长度可以自动随着元素数量的增长而增长,但不会随着元素数量的减少而减少。
数组的容量=长度,不可改变。
slice底层是数组,扩容是指向新数组了。扩容的时候容量每次翻倍。扩容是在容量不够的时候才扩,并不是每次都扩。
make(类型,长度,容量) // 类型如[]int,10,100
slice:变长数组。痛点是长度固定。
在已有数组上创建切片,在没有扩容前执行原数组。
深拷贝与前拷贝:其中copy非常灵活。
数组:相同数据类型的一组数。值复制。相同数据类型 arr1 == arr2,比较的里面的值和长度,而不是地址。
js中的数组,本质是slice,而不是go中的数组。
8,语句
if statemennt; condition {}。例如:if num:=10; num%2==0 {} // num只能在if里面使用
switch 省略后面的变量相当于true,也可以有表达式,用法跟if相同。
fullthrough,穿透case:
for
变现写法。但变量作用域变了。
for {} 省略了表达式2,永真,相当于while(true)
goto loop
没有while,do while
7,输入输出
输出:print
print, printf, println
%v, %T, %t, %s, %c字符,%f, %d, %p 地址
%b 二进制
%o 八进制
%x 0-9, a-f
%X 0-9, A-F
输入:scan,阻塞式
scanln, scanf
bufio包:文件读写。
6,运算符
div := a / b //取商
mod := a % b //取余,也叫取模
++,--做了精简,只能作为表达式,不参与运算。
5,基本数据类型转换
int()
4,字符串
单引号,与双引号区别是:'A'是65(ascii码),双引号才是A
中国的gbk,兼容了ASCII码
Unicode统一编码,规范
utf-8,utf-16,utf-32 存储
d 单引号时,编码值
c, q
``和""都可以包字符串,而且可以互相包
字符串与byte的关系,太奇妙了,本质是字符串都是编码。
3,数据类型
基本数据类型:布尔型、数字(整数,浮点数,复数,byte)、字符串
复合数据类型:array,slice,function,pointer,struct,interface,channel等
int, uint跟平台有关。
byte是uint8的别称
rune是int32的别称
go语言的+只能连接
2,常量
一组常量,如果某个常量美原油初始化,默认和上一行一致。
const (
a int = 100
b
c string = "hello"
d
)
// b也是100
// c
可以枚举
iota,特殊常量,可以被编译器修改的常量,被用作枚举值
const (
a = iota // 0 第一次定义,是0
b = iota // 1 又定义一个常量,是1
c = iota // 2
)
const (
d = iota // 0 再次从零计算。跟const配对
e // 1
)
const (
MALE = iota // 0
FEMALE // 1
UNKNOWN // 2
)
1,变量
go是静态语言,变量的类型和赋值必须一致。
简短定义方式,左边的变量名至少有一个是新的
简短定义方式,不能定义全局变量
变量的零值,也叫默认值。数字0,字符串""
变量定义了就要使用,否则无法通过编译。