变量:
字符用byte型来定义 var a byte
注意:简洁的赋值语句 := 不能在函数体外使用,常量const也不能使用 := 定义。
空标识符:
"_" 可以代表任何标识符,但它对应的值会被忽略
使用范围:
没有public private关键字,若变量名、函数名、常量名首字母大写,则可以被其他包访问,若首字母小写,则只能在本包中使用。
键盘输入:
从键盘中输入:fmt.Scanln(&a)
控制流:
1、if后必须跟"{ }",即使只有一行代码,同样,else里的内容也是
2、switch匹配项后不需要加break,因为执行完一个case语句就自动跳出了,从上到下判断,最后只会执行一条。default也不是必须的。
switch后可加表达式:则case的匹配项不可重复
switch后也可不加表达式:判断条件写case里
在case后加上fallthrough会继续执行下一个case,也叫穿透一层case
循环:
go有一个for-range语句,可以方便地遍历数组和字符串:
传统方法:
注:传统方法遍历含有中文的字符串会报错,因为中文在utf8占3个字节,但for-range不会报错,所以推荐使用。
go里面没有while和do...while!!!都可用for来代替
while:
do...while:
函数:
如果要调用其他包下的函数,被调用的函数名首字母大写,在import包时,路径自动从GOPATH的src下开始引入,不带src
使用调用函数的语法是:包名.函数名
在接受函数返回值时如果希望忽略某个值,用"_"
当返回值只有一个,返回值类型列表的括号可以不写
go函数不支持重载!!
函数也是一种类型,可以赋值给一个变量,变量调用函数
函数做形参时,需要把它的形参实参的返回类型都指出
自定义数据类型: type myInt int 则myInt等价于int
函数支持可变长度的形参:
init函数
每个源文件可以包含一个init函数用于初始化,可以在main函数之前,全局定义之后执行。
匿名函数
只调用一次的函数,可以不取名字,直接用变量去取结果
将匿名函数赋给全局变量,该函数就可以全局使用了。。。
闭包:
闭包是指匿名函数和它用到的变量(或函数)组成的整体,有累加的效果。
累加器案例:
第一次看这段代码会被AddUpper()函数的输入输出搞懵,因为它好像不需要输入值那它是怎么被调用的?
解释:
这段代码里包含了两个函数,AddUpper()和一个匿名函数,匿名函数在AddUpper中被定义,并且AddUpper函数的返回值是该匿名函数。
闭包则是指这个匿名函数和它用到的函数外的n
因此累加器的调用过程是:首先定义一个变量去接匿名函数,然后对该函数变量 f 修改它的实参。
因为 f 一直是对匿名函数的操作,外部的 n 只初始化一次,每次调用匿名函数都会修改 n 值,
如果希望重新用一个累加器,则需要重新定义一个变量去接匿名函数。
整个过程也可理解为闭包是一个类的内部:定义 f 函数相当于初始化一个A类对象a,f(1) 相当于调用a.func(1)
class A{ int n =10; int func(int x) { n = n + x; return n; }
}
函数中的defer
在函数中加入defer关键字,可以先跳过这个语句,并将语句压入栈中,当函数运行到最后一句话时再出栈。
defer的价值:当函数执行完毕之后可以及时释放函数的资源。
函数参数传递方式:
值传递和引用传递,传递给函数的都是变量的副本。区别在于值传递传递的是值的拷贝,内存在栈上分配。
引用传递传递的是地址,地址对应的空间是存储数据,内存在堆上分配。
一般来说地址拷贝效率高,因为数据量小。值拷贝基本数据类型还好,结构体数据很大,拷贝效率低。
值类型:
int、float、bool、string、数组、结构体struct
引用类型:
指针、切片slice、map、管道chan、interface
处理字符串的常用函数:
1、统计字符串长度 len(str)
2、字符串遍历,同时处理有中文的问题 r := [ ]rune(str)
将字符串定义成切片然后遍历。
3、字符串转整数 "123"-->123 (需要导入strconv包)
n,err := strconv.Atoi("123")
4、整数转字符串 123-->"123"
str = strconv.itoA(123)
5、查找字串是否在字符串中
strings.Contains("absad","ab") //返回true/false
6、统计字符串有几个字串
strings.Count("aaa","a") //3
还有判断前后缀,查找字串出现的的位置,字符串比较大小,进制转换等,见笔记。
此外还有统计函数执行时间的方法,见笔记。
内置函数:
new和make用来分配内存,make主要分配引用类型
处理异常: