go 學(xué)習(xí)筆記2

字符串

字符串類型屬于預(yù)定義類型延届,所以不能直接修改字符串。字符串類型代表了一個字符串集合,在底層一個字符串值就是一個字節(jié)序列毡熏。字符串的長度就是字節(jié)序列中字節(jié)的個數(shù)(中文三個字節(jié)舍扰,英文一個字節(jié))倦蚪。一個字符串長度在編譯期間就能確定。使用range 就是unicode 輸出(即中文三個字節(jié)边苹,英文一個字節(jié))陵且。

函數(shù)

函數(shù)也是一個變量,比如 將一個匿名函數(shù)賦值給一個變量个束,那么這個變量每次調(diào)用都會更新內(nèi)部的值慕购。
eg

func intSeq() func() int {
    i := 0
    return func() int {
        i++
        return i
    }
}

func main() {

    f := intSeq()
    fmt.Println(f())
    fmt.Println(f())
    fmt.Println(f())

    f2 := intSeq()
    fmt.Println(f2())
}

output:
1
2
3
1

通道

通道用完一定要關(guān)閉。

no-blocking channel

常規(guī)的通過通道接受和發(fā)送數(shù)據(jù)是阻塞的茬底,我們可以使用default來實現(xiàn)非阻塞的發(fā)送和接受數(shù)據(jù)沪悲,當然 使用非緩沖通道個人認為是一個更好的選擇。

    func main() {
    messages := make(chan string)
    signals := make(chan bool)

    select {
    case msg := <-messages:
        fmt.Println("received message", msg)
    default:
        fmt.Println("no message received")
    }

 
    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message send")
    }

    select {
    case msg := <-messages:
        fmt.Println("received messafe", msg)
    case sig := <-signals:
        fmt.Println("received signal", sig)
    default:
        fmt.Println("no activity")
    }
    time.Sleep(time.Second)
}

打印結(jié)果是
no message received
no message send
no activity


msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message send")
    }

操作之所以打印no message send" 是因為沒有其他goroutine接收數(shù)據(jù)阱表,所以無法寫入數(shù)據(jù)殿如,如果沒有select會造成死鎖贡珊,如果進入第一個分支,可以使用緩沖通道或者(開啟一個讀取通道goroutine 而且必須使用runtime.GOsched 讓開啟的協(xié)程有機會運行)涉馁。
eg

    go func() {
        //  <-messages
        fmt.Println("Received from other go routine", <-messages)
    }()
    runtime.Gosched() // 必須存在门岔,讓goroutine有機會運行
    msg := "hi"
    select {
    case messages <- msg:
        fmt.Println("sent message", msg)
    default:
        fmt.Println("no message send")
    }

通道關(guān)閉

只有緩沖通道才需要關(guān)閉,關(guān)閉的通道不能再讀取數(shù)據(jù)烤送,這通常用在協(xié)調(diào)接受者.可以關(guān)閉非空的通道

速率限制

對每個請求采用 time.Tick 進行速率限制
使用golang http 協(xié)議直接開啟 協(xié)程處理請求寒随,還怎么在代碼段限制速率?
微服務(wù)設(shè)計:速率限制帮坚,熔斷妻往,降級

同步

通過通信實現(xiàn)共享內(nèi)存,一塊數(shù)據(jù)只能被唯一的一個goroutine所有叶沛。(*查看一下怎么理解通過通信共享內(nèi)存)

eg:并發(fā)的map

   go func() {
        var state = make(map[int]int)
        for {
            select {
            case read := <-reads:
                read.resp <- state[read.key]
            case write := <-writes:// 更新map都是在這里進行同步蒲讯,不會造成并發(fā)map不安全問題
                state[write.key] = write.val
                write.resp <- true
            }
        }
    }()

share memory by communicating,not commnnicating by sharing

通信來共享內(nèi)存:這種情況一般而言是通過channel傳送數(shù)據(jù)指針,并且約定傳送之后不再修改這個數(shù)據(jù)灰署。
共享內(nèi)存通信:類似聲明一個全局變量判帮,在每個協(xié)程訪問的時候加鎖

不過這不是一定的,在合適的地方使用合適的方式.

不同線程不共享內(nèi)存不用鎖溉箕,線程之間通信和同步都是用channel
eg:


type readOp struct {
    key  int
    resp chan int
}
go func() {
        var state = make(map[int]int)
        for {
            select {
            case read := <-reads:
                read.resp <- state[read.key]
            case write := <-writes:
                state[write.key] = write.val
                write.resp <- true
            }
        }
    }()
    
    for r := 0; r < 100; r++ {
        go func() {
            for {
                read := &readOp{
                    key:  rand.Intn(5),
                    resp: make(chan int)}
                reads <- read
                <-read.resp
                atomic.AddUint64(&readOps, 1)
                time.Sleep(time.Millisecond)
            }
        }()
    }

通過channel 來控制map的訪問而不是通過mutex
通過channel 通信傳輸?shù)氖侵羔樆耷剑孕薷牡臅r候 也是修改的元數(shù)據(jù)。
返回數(shù)據(jù)resp 為什么用chan 類型因為 只有chan 類型才能監(jiān)控到數(shù)據(jù)已經(jīng)返回肴茄,使用其他數(shù)據(jù)類型無法做到數(shù)據(jù)返回監(jiān)控晌畅。
通過信息通信共享內(nèi)存,而不是共享內(nèi)存通信寡痰,如果用共享內(nèi)存抗楔,可以使用map[] mutex.lock
.一定要注意channel 傳遞的是指針。拦坠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末连躏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贞滨,更是在濱河造成了極大的恐慌入热,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晓铆,死亡現(xiàn)場離奇詭異勺良,居然都是意外死亡,警方通過查閱死者的電腦和手機骄噪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門尚困,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人链蕊,你說我怎么就攤上這事尾组∶γⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵讳侨,是天一觀的道長。 經(jīng)常有香客問我奏属,道長跨跨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任囱皿,我火速辦了婚禮勇婴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘱腥。我一直安慰自己耕渴,他們只是感情好,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布齿兔。 她就那樣靜靜地躺著橱脸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪分苇。 梳的紋絲不亂的頭發(fā)上添诉,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機與錄音医寿,去河邊找鬼栏赴。 笑死,一個胖子當著我的面吹牛靖秩,可吹牛的內(nèi)容都是我干的须眷。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼沟突,長吁一口氣:“原來是場噩夢啊……” “哼花颗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起事扭,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤捎稚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后求橄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今野,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年罐农,在試婚紗的時候發(fā)現(xiàn)自己被綠了条霜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡涵亏,死狀恐怖宰睡,靈堂內(nèi)的尸體忽然破棺而出蒲凶,到底是詐尸還是另有隱情,我是刑警寧澤拆内,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布旋圆,位于F島的核電站,受9級特大地震影響麸恍,放射性物質(zhì)發(fā)生泄漏灵巧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一抹沪、第九天 我趴在偏房一處隱蔽的房頂上張望刻肄。 院中可真熱鬧,春花似錦融欧、人聲如沸敏弃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽麦到。三九已至,卻和暖如春逝薪,著一層夾襖步出監(jiān)牢的瞬間隅要,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工董济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留步清,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓虏肾,卻偏偏與公主長得像廓啊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子封豪,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理谴轮,服務(wù)發(fā)現(xiàn),斷路器吹埠,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 從三月份找實習(xí)到現(xiàn)在第步,面了一些公司,掛了不少缘琅,但最終還是拿到小米粘都、百度、阿里刷袍、京東翩隧、新浪、CVTE呻纹、樂視家的研發(fā)崗...
    時芥藍閱讀 42,218評論 11 349
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,934評論 6 13
  • 金雞送瑞,轉(zhuǎn)眼淑仆,又一年過去了涝婉。做為即將離開學(xué)校的大四畢業(yè)狗。對人生也是充滿了迷茫糯景。 2016年一直在糾結(jié)接下來的路...
    hongjay閱讀 655評論 9 5
  • 7點起床嘁圈,吃飯,八點去圖書館蟀淮。 六級單詞兩個單元,上午下午钞澳。8~9/3-4/9之后怠惶。 上午翻譯做完。 中午打卡一小...
    葵葵魁閱讀 170評論 0 0