差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
public:it:go [2021/12/10 13:44] – oakfire | public:it:go [2022/11/10 12:37] (当前版本) – [Go Lang] oakfire | ||
---|---|---|---|
行 3: | 行 3: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
===== 学习笔记 ===== | ===== 学习笔记 ===== | ||
行 95: | 行 96: | ||
* 了解字符串的处理 | * 了解字符串的处理 | ||
+ | * 字符串库函数[[https:// | ||
+ | * 转换字符串[[https:// | ||
* 了解该语言在面向对象, | * 了解该语言在面向对象, | ||
* 函数(func)也为值,可传递,可作为参数与返回值 | * 函数(func)也为值,可传递,可作为参数与返回值 | ||
行 118: | 行 121: | ||
*/ | */ | ||
</ | </ | ||
+ | * 没有类的概念,但是可以定义带**reciever**(接收者)的函数作为自定义类型的方法:< | ||
+ | type Vertex struct { | ||
+ | X, Y float64 | ||
+ | } | ||
+ | func (v Vertex) Abs() float64 { // reciever (v Vertex) 放置在 func 与 函数名之间 | ||
+ | return math.Sqrt(v.X*v.X + v.Y*v.Y) | ||
+ | } // 本质上,方法与函数没有区别,即这个方法与 func Abs(v Vertex) float64 没有本质区别,仅仅是可以使用语法糖 v.Abs() | ||
+ | func main() { | ||
+ | v := Vertex{3, 4} | ||
+ | fmt.Println(v.Abs()) | ||
+ | } | ||
+ | </ | ||
+ | * 方法的 reciever 也是值传递,所以如果要修改 reciever 原值,需要把 reciever 定义为指针。在使用指针接收者方法时,默认不需要指针,即 '' | ||
+ | * go 使用 **interface type** (接口类型),接口类型变量可赋值实现了该接口方法的类型的变量,不需要像其它语言需要专门关键字 implement 接口,只要有对应的方法存在即可。fmt 包中定义的 Stringer 是最普遍的接口之一. | ||
+ | * 即便接口的具体值为 nil(接口本身不为nil),方法仍然会正常调用,此时 reciever 为 nil。 | ||
+ | * 指定了零个方法的接口值被称为 **空接口**, | ||
+ | * **type assertion**类型断言:'' | ||
+ | var i interface{} = " | ||
+ | s, ok := i.(string) | ||
+ | fmt.Println(s, | ||
+ | </ | ||
+ | * **type switch**类型选择< | ||
+ | switch v := i.(type) { // 这里 type 为固定关键字 | ||
+ | case T: | ||
+ | // v 的类型为 T | ||
+ | case S: | ||
+ | // v 的类型为 S | ||
+ | default: | ||
+ | // 没有匹配,v 与 i 的类型相同 | ||
+ | } | ||
+ | </ | ||
* 了解特有的语法糖 | * 了解特有的语法糖 | ||
* **多值返回**,函数可返回任意数量返回值,也可对返回值命名 '' | * **多值返回**,函数可返回任意数量返回值,也可对返回值命名 '' | ||
行 125: | 行 158: | ||
* 了解该语言错误处理, | * 了解该语言错误处理, | ||
+ | * 接口 error; 通常 fmt 包库函数会返回error, | ||
+ | i, err := strconv.Atoi(" | ||
+ | if err != nil { | ||
+ | fmt.Printf(" | ||
+ | return | ||
+ | } | ||
+ | fmt.Println(" | ||
+ | </ | ||
* 了解该语言的内存分配机制或GC, | * 了解该语言的内存分配机制或GC, | ||
+ | * **goroutine** 是由 Go 运行时管理的轻量级线程。 | ||
+ | * 信道(**channel**)操作符 ''< | ||
+ | ch := make(chan int, 1) // 创建int值信道, | ||
+ | ch <- v // 将 v 发送至信道 ch。 | ||
+ | v := < | ||
+ | </ | ||
+ | * 发送者可通过 '' | ||
+ | * 接收者可以通过表达式第二个参数来测试信道是否被关闭:若没有值可以接收且信道已被关闭,那么在执行完< | ||
+ | v, ok := < | ||
+ | * 循环 '' | ||
+ | * **select** 语句使一个 goroutine 协程可以等待多个通信操作。select 会阻塞到某个分支可以继续执行为止,这时就会执行该分支。当多个分支都准备好时会随机选择一个执行。如果有 '' | ||
+ | * '' | ||
* 了解该语言的编译/ | * 了解该语言的编译/ | ||
===== 剖析 ===== | ===== 剖析 ===== |