【Golang学习笔记】02
2018-01-09 21:26
246 查看
要点
- 部分运算符
- 控制语句
- 函数
后缀运算
前缀++ - - 被移除了, 后缀 ++ - - 只能作为语句 不能在放入表达式了
if 语句; bool{}else{}
for
循环只有for, while dowhile被移除了
使用range做循环
循环时使用range i代表序号, s代表value
goto
switch case
不需要break; 执行完当前case后就会自动跳出
匿名函数
函数赋值,必须是同一类型的函数
go的escape analysis
带多返回值的函数
不定长参数
将函数作为参数传递
延迟调用
错误处理
panic recover
- 部分运算符
- 控制语句
- 函数
部分运算符
byte运算const ( a byte = 1 << iota b c d ) x := a | b | c y := a | b | d fmt.Printf("%4b &^ %04b = %04b", x, y, x &^ y) // 111 &^ 1011 = 0100 // %nb, n代表占n位,0用空格代替, %0nb,0用0代替
后缀运算
前缀++ - - 被移除了, 后缀 ++ - - 只能作为语句 不能在放入表达式了
q := 1 //w:= q++ q++是语句不是表达式,此行编译不通过 q++ w:= &q *w++ fmt.Println(q) // 3
控制语句
if elseif 语句; bool{}else{}
// if x:=6;x > 5 { fmt.Println(x) // 这么赋值的话作用域只在if语句范围内 } else if x < 7{ fmt.Println(x) }
for
循环只有for, while dowhile被移除了
for i:=0; i < 10; i++ { fmt.Println(i) if i > 5 { break } }
使用range做循环
循环时使用range i代表序号, s代表value
DataArray := [5]int{10,20,30,40,50} for i,s := range DataArray { // for i := range DataArray { 也可以使用占位符或者省略s fmt.Println(i,s, &i, &s) } /* 0 10 0xc0420500d0 0xc0420500d8 1 20 0xc0420500d0 0xc0420500d8 2 30 0xc0420500d0 0xc0420500d8 3 40 0xc0420500d0 0xc0420500d8 4 50 0xc0420500d0 0xc0420500d8 i和s的地址始终一样,说明循环时用的时同一块内存空间 */
goto
q := 0 here: q++ if q < 3 { goto here } fmt.Println(q) // 3
switch case
不需要break; 执行完当前case后就会自动跳出
choice := 2 switch choice { case 1: fmt.Println(1) case 2: fallthrough //关键字 直接执行下一个case case 3: fmt.Println(3) case 4,5,6: fmt.Println(4) default: fmt.Println("default") } // 3
函数
不需要前置声明func main() { test() } func test() { fmt.Println("不需要前置声明") }
匿名函数
a := func() {fmt.Println("匿名函数")} a() // 或者 func() {fmt.Println("匿名函数")}()
函数赋值,必须是同一类型的函数
func test1(){ fmt.Println("test1") } func test2(){ fmt.Println("函数赋值") } func main() { b := test1 c := test2 b = c b() // 函数赋值 }
go的escape analysis
func test3() *int{ a := 1 // 在函数内创建,应该是申请的栈内存,但是因为外部有引用所以逃逸到了堆上(go的escape analysis) fmt.Println(a, &a) return &a } func main() { d := test3() fmt.Println(*d, d) } //1 0xc042050090 //1 0xc042050090 //内存地址完全一样,所以说明外部得到的就是在函数内申请的内存空间。
带多返回值的函数
func Divide(a int, b int) (int, error) { if (b == 0) { return 0, errors.New("Can't Divide 0") } return a/b,nil } func main() { w, err := Divide(2, 0)// err也可以用_占位符代替 fmt.Println(w, err) }
不定长参数
// 不定长参数函数 参数名 ... 数据类型 func VariableLength(a ... int) { fmt.Printf("%T, %v \n", a, a) } func main() { q := []int{1,2,3,4,5,6} VariableLength(q...) // 无敌的省略号 }
将函数作为参数传递
// 将函数作为参数传过去 func test(q int, w string,f func(a int,s string)(int, string)) { f(q, w) } func n1(a int, s string)(int, string){ fmt.Println(a, s) return a,s } func main() { test(1,"abc0", n1) }
延迟调用
func main() { // 延迟调用 关键字 defer defer fmt.Println("a001") defer fmt.Println("a002") fmt.Println("a003") fmt.Println("a004") } /* a003 a004 a002 a001 先defer的排在最后 */
错误处理
panic recover
func main() { // 错误处理 defer func() { if err := recover(); err != nil { fmt.Println("recover", err) // 恢复中断的程序 可以用作释放资源之类的操作 } }() panic("here panic") // 中断程序 fmt.Println("after panic")//这句不会执行 }
相关文章推荐
- maven学习笔记-02-maven配置篇
- 02、刘媛媛《普通人快速崛起31节修炼课》 第二讲 个人学习笔记
- Android自定义view学习笔记02
- 【Ext.Net学习笔记】02:Ext.Net用法概览、Ext.Net MessageBus用法、Ext.Net布局
- Golang学习笔记
- golang学习笔记-func函数
- java学习笔记.02——泛型限定符
- 【NodeJS 学习笔记02】入门资源很重要
- 设计模式学习笔记02
- Golang学习笔记
- (原创)c#学习笔记02--编写c#程序01--开发环境
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术02--继承
- Jqgrid学习笔记__02__自适应
- MIT计算机科学及编程导论02课学习笔记
- (原创)c#学习笔记03--变量和表达式02--C#控制台应用程序的基本结构
- golang代码文件目录组织、包目录组织学习笔记
- JQuery学习笔记02-选择器把需要的东西揪出来(基础)
- FC网络学习笔记02 -网络配置方法
- golang学习笔记-包的概念
- 关于Golang中database/sql包的学习笔记(转载)