Go 常量、init、数组、类型转换与断言、Recover
2017-11-15 20:02
393 查看
一、常量
Go中的常量仅仅就是—常量。它们是在编译时被创建,即使被定义为函数局部的也如此,并且只能是数字,字符(符文),字符串或者布尔类型。由于编译时的限制,定义它们的表达式必须为能被编译器求值的常量表达式。例如,1<<3是一个常量表达式,而math.Sin(math.Pi/4)不是,因为函数调用math.Sin需要在运行时才发生。二、init
每个源文件可以定义自己的不带参数的(niladic)init函数,来设置它所需的状态。(实际上每个文件可以有多个init函数。)init是在程序包中所有变量声明都被初始化,以及所有被导入的程序包中的变量初始化之后才被调用。除了用于无法通过声明来表示的初始化以外,init函数的一个常用法是在真正执行之前进行验证或者修复程序状态的正确性。
三、数组
在Go和C中,数组的工作方式有几个重要的差别。在Go中:数组是值。将一个数组赋值给另一个,会拷贝所有的元素。
特别是,如果你给函数传递一个数组,其将收到一个数组的拷贝,而不是它的指针。
数组的大小是其类型的一部分。类型[10]int和[20]int是不同的。
四、断言
str := value.(string)
不过,如果该值不包含一个字符串,则程序会产生一个运行时错误。为了避免这样,可以使用“comma, ok”的习惯用法来安全地测试值是否为一个字符串:
str, ok := value.(string) if ok { fmt.Printf("string value is: %q\n", str) } else { fmt.Printf("value is not a string\n") }
如果类型断言失败,则str将依然存在,并且类型为字符串,不过其为零值,一个空字符串。
五、Recover
对于一些隐式的运行时错误,如切片索引越界、类型断言错误等情形下,panic方法就会被调用,它将立刻中断当前函数的执行,并展开当前Goroutine的调用栈,依次执行之前注册的defer函数。当栈展开操作达到该Goroutine栈顶端时,程序将终止。但这时仍然可以使用Go的内建recover方法重新获得Goroutine的控制权,并将程序恢复到正常执行的状态。调用recover方法会终止栈展开操作并返回之前传递给panic方法的那个参数。由于在栈展开过程中,只有defer型函数会被执行,因此recover的调用必须置于defer函数内才有效。
本文整理自:https://www.kancloud.cn/kancloud/effective/72199
个人微信公众号:
作者:jiankunking 出处:http://blog.csdn.net/jiankunking
相关文章推荐
- GO断言来转换数据类型
- GO语言总结(5)——类型转换和类型断言
- Go语言学习笔记 --- 常量、变量、批量定义与声明、数据类型、类型别名、类型转换
- GO语言类型转换和类型断言实例分析
- JNI的某些数组和字符串类型转换(转)
- C#/C++ 中字节数组与int类型转换
- Java中char数组与字符串String类型的转换
- C++中四种类型转换以及const_cast是否能改变常量的问题
- 多维数组的指针类型转换和参数传递
- 14章类型信息-之类型转换前先做检查--之使用类字面常量--类名.class--以及动态instanceof(isInstance方法)----递归计数(计算各个类的个数)
- string数组类型转换为int数组(数组类型之间的转换)
- C# 数组类型转换 int[] 转换string[]
- java中byte数组与int类型之间的相互转换(两种方式)
- for语句,const定义,数组操作,类型转换,static等注意点
- 【delphi】Byte数组与String类型的转换
- 转载-两种将int类型的数据转换成byte数组,以及反向转换的代码
- socket编程 各种类型转换成字节数组(java)
- Go语言学习之数据类型以及类型转换(The way to go)
- Gotchas 31-对目标类型为指涉物为常量的指针类型的类型转换的认识误区
- json数组如何转换成string类型(超级好用)