差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
| public:it:go [2022/01/19 09:51] – oakfire | public:it:go [2025/06/05 15:02] (当前版本) – oakfire | ||
|---|---|---|---|
| 行 3: | 行 3: | ||
| * [[https:// | * [[https:// | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| + | ===== Tips ===== | ||
| + | * 设置go mod 下载代理:< | ||
| + | go env -w GOPROXY=https:// | ||
| ===== 学习笔记 ===== | ===== 学习笔记 ===== | ||
| 行 95: | 行 99: | ||
| * 了解字符串的处理 | * 了解字符串的处理 | ||
| + | * 字符串库函数[[https:// | ||
| + | * 转换字符串[[https:// | ||
| * 了解该语言在面向对象, | * 了解该语言在面向对象, | ||
| * 函数(func)也为值,可传递,可作为参数与返回值 | * 函数(func)也为值,可传递,可作为参数与返回值 | ||
| 行 118: | 行 124: | ||
| */ | */ | ||
| </ | </ | ||
| - | * 没有类的概念,但是可以定义带**reciever**的函数作为自定义类型的方法:< | + | * 没有类的概念,但是可以定义带**reciever**(接收者)的函数作为自定义类型的方法:< |
| type Vertex struct { | type Vertex struct { | ||
| X, Y float64 | X, Y float64 | ||
| 行 128: | 行 134: | ||
| v := Vertex{3, 4} | v := Vertex{3, 4} | ||
| fmt.Println(v.Abs()) | 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 的类型相同 | ||
| } | } | ||
| </ | </ | ||
| 行 136: | 行 161: | ||
| * 了解该语言错误处理, | * 了解该语言错误处理, | ||
| + | * 接口 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 会阻塞到某个分支可以继续执行为止,这时就会执行该分支。当多个分支都准备好时会随机选择一个执行。如果有 '' | ||
| + | * '' | ||
| * 了解该语言的编译/ | * 了解该语言的编译/ | ||
| ===== 剖析 ===== | ===== 剖析 ===== | ||