Go 语言新手笔记(二)

Go 语方的数组声明方式别具一格,把 [] 看得太重了,看下面的各种声明方式

再次强调 Go 的数组是值类型,作为函数参数传递会产生副本。避免传入数组产生副本消耗过多内存,办法是可传数组指针或用切片,切片是第一选择。

数组的大小最大为 2GB,用 ==!= 比较两个数组时它们必须类型和长度一致。

切片(slice) 是对数组的一个连续片断引用, 切片的各种创建方式

切片相对于数组有些像数据库的视图与数组的关系。切片的一个基本操作 append(),超出容量时会指向新的数组。

map 的基本声明和操作

type 定义类型或别名的用法

Go 的函数也是一种类型,与函数的签名一致,有点像 C/C++ 的函数指针一样

Go 的错误处理类型是 error, Go 居然没有像多数现代语言那样的 try/catch 方式,而是通常函数在有错误的时候额外返回一个  error

个人不太喜欢这种异常的处理方法,看看 panic, differ 和 recover。下面是 panic, recover 和 differ  的用法, 以及理解它们是怎么工作的

输出

caught error: runtime error: integer divide by zero
caught error: not negative
panic: runtime error: integer divide by zero
goroutine 1 [running]:
main.div1(...)
/Users/yanbin/Workspaces/tests/test-go/src/test.go:22
main.main()
/Users/yanbin/Workspaces/tests/test-go/src/test.go:29 +0x4f

好像有了 try/catch 的影子了。recover() 函数只能在有 defer 修饰的函数中使用,用于取得异常传递来的错误信息,没错的话它返回 nil.

panic(): 严重不可恢复,recover(): 从异常或错误中恢复,defer 延迟

Go 也可以像 JavsScript  那样定义一个函数并立即执行它

defer 在 Go 语言中还是比较新鲜的东西,又有一种 finally 的味道,defer 的三个规则

  1. defer 声明时其后面函数参数被实时解析
  2. defer 执行顺序为先进后出 (FILO)
  3. defer 可读取函数的有名返回值

输出为 hello world !!!

输出为 10,return 语句相当于是  ret = xxx -> 调用 defer() -> return ret

函数的定义格式为 func functionName(a typea, b typeb)(r1 type1, r2 type2), 具体会有以下几种形式

Go 的函数不允许重载,Go 默认按值传递,传入的参数会先产生一个副本。要能修改参数值的话需传入一个地址,这时候函数及调用方式为

这是不是和  C/C++ 的指针一样的!

Go 的内置函数 make(T) 和 new(T)

  1. make(T): 只用于 slice, map 以及  channel, 返回为 T 的值类型
  2. new(T): 用于值类型的内存分配,并设置为零值,它返回的是一个指向 T 类型的指针

其他的一些内置函数,len(), cap(), append(), copy(), delete(), close(), complex(), real(), image(), panic(), recover(), print(), println()

Go 的匿名函数也称为闭包,闭包对变量的捕获相当于引用传递,即不不会产生副本。可以修改外层的变量

对变参函数的调用,传入多个值,切片时要打散传入, 数组必须转换成 slice, 再打算传入

Go 对新建的 array 或 slice 可以立即取值,但不能立即由新建的 array  得到一个  slice

本文链接 https://yanbin.blog/go-language-notes-2/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments