golang 笔记

dh-dh · · 709 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang 的坑

package main

import (
    "fmt"
    "net/http"
    "time"
)

func Hello(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("Hello!!\n"))
    time.Sleep(10 * time.Second)
}

func main() {
    http.HandleFunc("/hello", Hello)
    addr := "0.0.0.0:8083"
    if err := http.ListenAndServe(addr, nil); err != nil {
        fmt.Println(err)
        return
    }
}

ResponseWriter.Write只是将数据写进了一个缓冲区,如过缓冲区未被写满是不会往tcp连接里写的,表现为包没发出去。http server会在Handler函数结束后调用Flush,所以在Handler函数里的任何阻塞行为都会影响到回包数据的发送。
有两种方法来规避:
主动调用Flush
w.(http.Flusher).Flush()
将长操作用go包起来
go func() { time.Sleep(10*time.Second) }()

go并行计算

func main() {
    arr := [4]int{1, 2, 3, 4}
    var wg sync.WaitGroup
    for _, v := range arr {
        wg.Add(1)
        fmt.Println(v)
        go func(i int) {
            defer wg.Done()
            fmt.Println(i)
        }(v)
    }
    wg.Wait()
}

wg.Add()会+1,wg.Done()会-1, wg.Wait()一直阻塞到0;

go线程间通信

func main() {
    ch := make(chan int, 2)
    go func() {
        for i := 0; i < 2; i++ {
            ch <- i
        }
    }()
    fmt.Println("print")
    for j := 0; j < 2; j++ {
        res, ok := <-ch
        if ok {
            fmt.Println(res)
        }
    }

}

通过go关键字可以开启一个协程执行此函数。通过channel通信。
ch是一个可读可写channel,有2个缓存,可连续写入2次。如果再写入就会堵塞,一直等到数据被消费。

go map 初始化

m := make(map[string]int)
m["a"] = 1
m["b"] = 2

 m := map[string]interface{}{
        "Name": "Wednesday",
        "Age":  6,
        "Parents": []interface{}{
            "Gomez",
            "Morticia",
        },
    }

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:dh-dh

查看原文:golang 笔记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

709 次点击  ∙  1 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传