Introducing Go
目录
Get Started
类型
变量
控制结构
- for i<=10 { ... } //for关键字这里用作while
- if:这里为什么不加()呢?跟Swift学的?还是跟Python?
Arrays, Slices, and Maps
- x := make(map[string]int) //map的默认值是nil,所有必须先make,才能往里面add元素
- 嵌套的map(JSON?):elements := map[string]map[string]string { ...
Functions
- 变参://这到底是运行时还是编译器的?
- func Println(a ...interface{}) (n int, err error)
- xs := []int{1,2,3}; fmt.Println(add(xs...))
- 闭包
- 支持闭包的前提是:外部引用变量是heap上分配的,但Go可以直接返回函数和C语言只能返回函数指针有什么不同?
- defer, panic, recover
- *与&
Structs and Interfaces
- c := &Circle{0, 0, 5} //这可能是Go语言里struct的最正常用法?
- 因为参数都是传值的(?),所以函数一般使用指针来传参?//C语言不也是传值的嘛,C++里可以传引用&
- func (r *Rectangle) area() float64 { ... }
- ==> r := Rectangle{0, 0, 10, 10}; r.area()
- 表达is-a:嵌入类型(好像另外那个语言也是这种匿名风格的?)
- Interfaces
- type Shape interface { area() float64 }
包
- strings
- strings.Contains("test", "es") //为什么不是直接在string对象上扩展方法?
- strings.Join([]string{"a","b"}, "-")
- strings.Replace("aaaa", "a", "b", 2) //最后一个参数代表最多替换个数?为什么不是startIndex呢
- IO:Reader与Writer
- func Copy(dst Writer, src Reader) (written int64, err error)
- bytes.Buffer
- Files and Folders
- file, err := os.Open("test.txt") //rw?
- stat, err := file.Stat() ==> stat.Size()
- os.Open(".").Readdir(-1) //这个代码有点太低级了
- 使用包path/filepath的目录遍历:
- filepath.Walk(".", func(path string, info os.FileInfo, err error) error { ...(可返回filepath.SkipDir停止遍历) } //似乎没有控制选项啊?
- container/list://双链表??有没有高级一点的数据结构
- sort.Sort
- 需要(数组)对象实现3个方法:Len() int、Less(i, j int) bool、Swap(i, j int) //Go语言支持a,b=b,a的交换赋值语法
- hash与密码学*
- Servers
- TCP
- listener, err := net.Listen("tcp", ":9999")
- for { con, err := listener.Accept() //嗯?必须收到一个连接才能收到下一个吗?
- err := gob.NewDecoder(c).Decode(&msg) //var msg string; gob是什么编解码算法?
- 客户端:
- c, err := net.Dial("tcp", "127.0.0.1:9999")
- HTTP
- http.HandleFunc("/hello", hello) //func hello(res http.ResponseWriter, req *http.Request) { ... }
- http.ListenAndServe(":9000", nil)
- 静态文件:http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets")),),) //这里是不是多了几个逗号?
- RPC(略)
- TCP
- 解析命令行参数
- flag.Parse()
Testing
- _test.go
- import "testing"
- func TestAverage(t *testing.T) { ...t.Error(...)... }
- $ go test
并发
- <创建channel,并传递给goroutine>
- select {
- case <- time.After(time.Second): //超时
- c := make(chan int, 1) //缓冲的channel是异步的(但是超出限制仍然会阻塞吧)
- 发起http GET请求:res, err := http.Get(url) //这个也太简洁了吧?(没有请求Header的设置)
Next Steps
- 阅读Go pkg下的代码实现?
有疑问加站长微信联系(非本文作者)