Go语言编程(旧读书笔记)
Go语言编程
文件夹[隐藏] |
[编辑]前言
- 协程? go run('test')
- Go强制了{ }的编写风格: if expression {
- 错误处理:
- defer?相当于finally?注意这里的作用域,defer之前似乎没实用{ }把整个(try)块括起来?
- defer相当于说推迟语句的运行,其内部实现会自己主动管理嵌套作用域的问题?
- Go同意返回多个值(像Python里的tuple返回)
- defer?相当于finally?注意这里的作用域,defer之前似乎没实用{ }把整个(try)块括起来?
- Go用组合,不用继承、虚函数、虚函数重载
- Go里的变量声明是先变量名字,后类型名字(Pascal风格,但没有:)?
- Go的接口是duck typing吗?
- Go里。2个接口仅仅要拥有同样的方法列表(名字、签名、
顺序??),那么就是等同的
- Go里。2个接口仅仅要拥有同样的方法列表(名字、签名、
- ?Go里避免太多的{ }嵌套可能是一种策略——这使它显得更像一门脚本语言。给程序猿写代码带来某种“轻快”的感觉。
。。
[编辑]初识Go语言
- Plan 9上的Limbo语言被觉得是Go的前身?
- 支持自己主动GC?——那不就和Java/C#的性能几乎相同了么
- 更丰富的内置类型:
- Slice
- map
- 多返回值
- func getName() (firstName, lastName, nickName string){
-
//因为这里返回值也给了名字。因此可以赋值然后空return!
(Python里似乎还不可以这么灵活。靠)
-
//因为这里返回值也给了名字。因此可以赋值然后空return!
- fn, ln, nn := getName()
- 模式匹配(destructuring):_,ln,_ := getName()
- func getName() (firstName, lastName, nickName string){
- 错误处理:defer、panic、recover
- 匿名函数和闭包
- f := func(x,y int) int { return x+y }
- 类型:类似于C里的struct(预计这里借用了Objective-C的一些做法。
。
。)
- type Bird struct { ... }
- func (b *Bird) Fly() { ... } //这一句的写法我怎么有点看不明确呢?见鬼
- 并发编程
- resultChan := make(chan, int, 2)
- go sum(.../*參数略*/, resultChan)
- func sum(..., resultChan chan int) {
- ... resultChan <- sum
- sum1, sum2 := <-resultChan, <-resultChan //Channel对象仅仅有一个符号操作:<- 。放左边代表取出,右边表示放进?
- 反射:靠,这边的语法太丑陋了,妈的
- Cgo
- 第1个Go程序:
- package main
- import "fmt"
- func main() {
- fmt.Println("Hello, world!")
- go run hello.go //直接执行。
- go build hello.go && ./hello //编译执行。即能够解释执行,也能够编译执行(这个跟Rust倒是一样的)
[编辑]顺序编程
- var v3 [10]int //变态的数组声明语法~
- var v7 map[string] int //string->int的映射
- i := 10 //自己主动类型推导?
- i,j = j,i
- 数值类型:int uint int32 int64 float32 float64 complex64 complex128
- const
- true false iota(每一个const的开头从0開始。每次出现自己主动增1?用于定义枚举。但Go并不支持enumkeyword)
- string byte/rune error
- uintptr
- 不同类型的数不能直接比較,也就是说,Go不做自己主动类型提升?
- 字符串遍历:for i := 0; i < len(str); i++ { ... str[i] }
- Unicode字符遍历:
- for i, ch := range str { ... }
- 数组是一个值类型。
- 切片:var mySlice []int = myArray[:5]
- mySlice2 := make([]int, 5)
- 可动态增减元素:len(mySlice) cap(mySlice) append copy ...
- 切片:var mySlice []int = myArray[:5]
- map
- delete(myMap, "key") //靠,这里的操作都是C语言风格的,不支持C++/Java/C#里的.成员函数訪问操作?
- 流程控制:
- if else
- switch case
- for
- goto
- 函数
- 成员函数的写法太怪异了:func (file *File) Read(b []byte) (n int, err Error) //注意。没有其它语言里的this、self等keyword!
- 闭包
- 错误处理
- p48 return nil, &PathError("stat", name, err) //这里&的写法是怎么回事?以引用方式传递对象吗
- defer func() { ... } ()
- func panic(interface())
- func recover() interface()
[编辑]OOP
- 值语义(默认?)和引用语义(&)
- ?Go使用*符号。那么它究竟是不是C/C++里的指针?(预计不是。但看着有点诡异)
- 初始化
- r1 := new(Rect)
- r2 := &Rect()
- 组合就是继承:type Derived struct{
- Base //还能够写成*Base,这种话,。。。——相当于C++里的虚基类?
- ... //*log.Logger:可直接注入其它类的方法?但logger类显然无法訪问当前类的数据成员(!!)
- 可见性:大写为public。小写是private
- (非侵入式的)接口
- 这里的语法似乎有点类似于Objective-C。
。
。注意声明type IFile interface { ... }时,里面的Read、Write不须要带(f *File)(this引用)
- 接口查询:略
- 类型查询:vt := v.(type)
- 接口组合
- Any类型:interface()
- 这里的语法似乎有点类似于Objective-C。
[编辑]并发编程
- 主main不等待goroutine直接退出会导致线程强制结束?
- channel
- select(这是学习了Erlang吧?)
- 超时机制:创建一个额外的channel
- timeout := make(chan bool, 1)
- go func() { time.Sleep(1e9) timeout <- true }()
- select {
- ... case <-timeout: //已经超时
- 利用channel传递实行管道?
- 单向chan:声明的时候加上<-
- 关闭:close(ch)
- 同步
- sync.Mutex sync.RWMutex
- sync.Once
[编辑]网络编程
- net.Dial?这种方法名太。。
。
了
- net/http
- net/rpc
- Gob
- JSON
[编辑]安全编程
- 略
[编辑]project管理
- 远程import:神经病!
- GOPATH
- Android支持???——必须在adb shell下执行吧
[编辑]开发工具
[编辑]进阶话题
- 反射
- Type, Value
- 语言交互
- Cgo:import "C"
- 链接符号:由下列信息构成(注意Go里无重载)
- Pakcage
- ClassType
- Method(恩?链接符号同意/、*、. ?)
- goroutine机制
- libtask?
- 接口机制
[编辑]附录A
- 经常使用包:fmt io bufio strconv os sync flag encoding/json http
浙公网安备 33010602011771号