学习Go的一些需要注意的知识点。
一、GO中的包
1、这个是GO中非常基础,包使用package定义,使用import导入,可以理解PHP中的类,使用自动加载,所以包名称和路径名称必需一致,且包名称必需小写
2、包中的常量、变量、函数的首字母,表示包外常量、包外变量、包外方法,可以理解为public,可以在另一个包中使用。如果首字母小写,表示包内,可以理解为private,仅可以在同一个包内部使用。
3、因为一个目录即表示一个包,所以同一个目录下的包名称必需一致
4、你可以通过使用包的别名来解决包名之间的名称冲突。
二、变量
1、使用关键字var声明,格式 var identifier type
2、type的类型有:
- string:字符串,Go语言的字符串的字节使用UTF-8编码标识Unicode文本
- bool:true / false
- int系列:包括int、int8、int16、int32、int64、uint、uint8、uint16、uint32、uint64
int:32位或64位,和操作系统有关。
int8:2的7次方,-128到127
int16:2的15次方,-32768到32767
int32:2的31次方,-2147483648 到 2147483647
int64:2的63次方,-9223372036854775808 到 9223372036854775807
uint:32位或64位,和操作系统有关。
uint8:2的8次方,0 到 255
int16:2的16次方,0 到 65535
int32:2的32次方,0 到 4294967295
int64:2的64次方,0 到 18446744073709551615 - 浮点系列:float32、float64、complex64、complex128
float32:IEEE-754 32位浮点型数
float64:IEEE-754 64位浮点型数
complex64:32 位实数和虚数
complex128:64 位实数和虚数 - 其它类型:byte、rune、uintptr
byte:类似 uint8
rune:类似 int32
uintptr:无符号整型,用于存放一个指针 - 派生类型:指针类型(Pointer)、数组类型、结构化类型(struct)、Channel 类型、函数类型、切片类型
、接口类型(interface)、Map 类型
三、运算符
1、GO是强类型语言,不同类型的值进行二元运算,无法通过编译。
2、Go 对于值之间的比较有非常严格的限制,只有两个类型相同的值才可以进行比较,假如 a == b,此时a、b的类型也必需一致,否则,无法通过编译。
四、时间
1、特别注意:在go中的日期format格式,使用2006代表年,01代表月,02代表日,03代表小时、04代表分、05代表秒。
2、获取当前时间戳,time.Now().Unix()
获取指定时间的时间戳:
tm1, _ := time.Parse(“2006-01-02 03:04:05″, “2018-01-01 01:01:01″)
fmt.Println(tm1.Unix())
mt.Println(tm1.Format(“2006-01-02 03:04:05″))
五、控制结构
1、Go 完全省略了 if、switch 和 for 结构中条件语句两侧的括号,相比 Java、C++ 和 C# 中减少了很多视觉混乱的因素,同时也使你的代码更加简洁。
2、switch的集中格式:
switch var1 { case val1: ... case val2: ... default: ... }
switch { case condition1: ... case condition2: ... default: ... }
switch initialization { case val1: ... case val2: ... default: ... }
六、函数
1、函数中可以没有形参,但必需要有形参的类型,例如:func f1(int, string) (string){return “a” }
2、函数中如果有有多个分支,则每个分支都必需有return,例如:if else 则必需有2个return 关键字。
3、理解函数非命名返回值和命名返回值,尽量使用命名返回值:会使代码更清晰、更简短,同时更加容易读懂。
4、defer函数的用法
5、闭包函数的用法,看下面的例子
func Connect() { start := time.Now() p2 := add() fmt.Println(p2(2)) p3 := adder(20) fmt.Println(p3(30)) fmt.Println(p3(60)) fmt.Println(p3(10)) elapsed := time.Since(start) fmt.Println(elapsed) } func add() (func(arg int) int) { return func(b int)(rst int) { rst = b + 1 return } } func adder(arg int) (func(arg int) int) { return func (a int) (rst int) { arg += a return arg } }
输出结果:
3 50 110 120 26.697µs
利用闭包函数(其实这里使用了工厂函数)高效实现斐波那契数列,相比递归实现性能高出何止千倍。
func Connect() { start := time.Now() add(10) elapsed := time.Since(start) fmt.Println(elapsed) } func add(a int) { f := adder(); for i := 1; i <= a; i++ { fmt.Println(f(i)) } } func adder() (func(a int) int) { pre1, pre2 := 0,0 return func(a int) (rst int) { if a <= 1 { pre1, rst = 1,1 } else { rst = pre1 + pre2 pre2 = pre1 pre1 = rst } return } }
6、工厂函数:一个返回值为另一个函数的函数可以被称之为工厂函数,这在您需要创建一系列相似的函数的时候非常有用:书写一个工厂函数而不是针对每种情况都书写一个函数。下面的函数演示了如何动态返回追加后缀的函数。
举例说明:
func Connect() { start := time.Now() addBmp := makeAddSuffix(".bmp") addPng := makeAddSuffix(".png") fmt.Println(addBmp("header")) fmt.Println(addPng("banner")) elapsed := time.Since(start) fmt.Println(elapsed) } func makeAddSuffix(suffix string) (func(file string) string) { return func(file string) string { return file + suffix } }
7、计算代码执行时间
start := time.Now() ......... end := time.Now() delta := end.Sub(start)
start := time.Now() .......... elapsed := time.Since(start) fmt.Println(elapsed)
Pingback引用通告: Go中结构体 struct 中的方法 | 精彩每一天
Pingback引用通告: Go中的各种变量类型转换 | 精彩每一天