Introducing Go - O'Reilly 2016 阅读笔记

Introducing Go

目录

  • 1 Get Started
  • 2 类型
  • 3 变量
  • 4 控制结构
  • 5 Arrays, Slices, and Maps
  • 6 Functions
  • 7 Structs and Interfaces
  • 8
  • 9 Testing
  • 10 并发
  • 11 Next Steps

Get Started

类型

变量

控制结构

  1. for i<=10 { ... } //for关键字这里用作while
  2. if:这里为什么不加()呢?跟Swift学的?还是跟Python?

Arrays, Slices, and Maps

  1. x := make(map[string]int) //map的默认值是nil,所有必须先make,才能往里面add元素
  2. 嵌套的map(JSON?):elements := map[string]map[string]string { ...

Functions

  1. 变参://这到底是运行时还是编译器的?
    1. func Println(a ...interface{}) (n int, err error)
    2. xs := []int{1,2,3}; fmt.Println(add(xs...))
  2. 闭包
    1. 支持闭包的前提是:外部引用变量是heap上分配的,但Go可以直接返回函数和C语言只能返回函数指针有什么不同?
  3. defer, panic, recover
  4. *与&

Structs and Interfaces

  1. c := &Circle{0, 0, 5} //这可能是Go语言里struct的最正常用法?
  2. 因为参数都是传值的(?),所以函数一般使用指针来传参?//C语言不也是传值的嘛,C++里可以传引用&
  3. func (r *Rectangle) area() float64 { ... }
    1. ==> r := Rectangle{0, 0, 10, 10}; r.area()
  4. 表达is-a:嵌入类型(好像另外那个语言也是这种匿名风格的?)
  5. Interfaces
    1. type Shape interface { area() float64 }

  1. strings
    1. strings.Contains("test", "es") //为什么不是直接在string对象上扩展方法?
    2. strings.Join([]string{"a","b"}, "-")
    3. strings.Replace("aaaa", "a", "b", 2) //最后一个参数代表最多替换个数?为什么不是startIndex呢
  2. IO:Reader与Writer
    1. func Copy(dst Writer, src Reader) (written int64, err error)
    2. bytes.Buffer
  3. Files and Folders
    1. file, err := os.Open("test.txt") //rw?
    2. stat, err := file.Stat() ==> stat.Size()
    3. os.Open(".").Readdir(-1) //这个代码有点太低级了
    4. 使用包path/filepath的目录遍历:
      1. filepath.Walk(".", func(path string, info os.FileInfo, err error) error { ...(可返回filepath.SkipDir停止遍历) } //似乎没有控制选项啊?
  4. container/list://双链表??有没有高级一点的数据结构
  5. sort.Sort
    1. 需要(数组)对象实现3个方法:Len() int、Less(i, j int) bool、Swap(i, j int) //Go语言支持a,b=b,a的交换赋值语法
  6. hash与密码学*
  7. Servers
    1. TCP
      1. listener, err := net.Listen("tcp", ":9999")
      2. for { con, err := listener.Accept() //嗯?必须收到一个连接才能收到下一个吗?
      3. err := gob.NewDecoder(c).Decode(&msg) //var msg string; gob是什么编解码算法?
      4. 客户端:
        1. c, err := net.Dial("tcp", "127.0.0.1:9999")
    2. HTTP
      1. http.HandleFunc("/hello", hello) //func hello(res http.ResponseWriter, req *http.Request) { ... }
      2. http.ListenAndServe(":9000", nil)
      3. 静态文件:http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("assets")),),) //这里是不是多了几个逗号?
    3. RPC(略)
  8. 解析命令行参数
    1. flag.Parse()

Testing

  1. _test.go
  2. import "testing"
    1. func TestAverage(t *testing.T) { ...t.Error(...)... }
  3. $ go test

并发

  1. <创建channel,并传递给goroutine>
  2. select {
    1. case <- time.After(time.Second): //超时
  3. c := make(chan int, 1) //缓冲的channel是异步的(但是超出限制仍然会阻塞吧)
  4. 发起http GET请求:res, err := http.Get(url) //这个也太简洁了吧?(没有请求Header的设置)

Next Steps

  1. 阅读Go pkg下的代码实现?

你可能感兴趣的:(并发,slice,Go,goroutine,Go语言编程)