-
Golang 并發(fā)原理分析
Go語(yǔ)言是為并發(fā)而生的語(yǔ)言,Go語(yǔ)言是為數(shù)不多的在語(yǔ)言層面實(shí)現(xiàn)并發(fā)的語(yǔ)言;也正是Go語(yǔ)言的并發(fā)特性,吸引了全球無(wú)數(shù)的開發(fā)者。 并發(fā)(concurrency)和并行(parallellism) 并發(fā)(concurrency):兩個(gè)或兩個(gè)以上的任務(wù)在一段時(shí)間內(nèi)被執(zhí)行。我們不必care這些任務(wù)在某一個(gè)時(shí)間點(diǎn)是否是同時(shí)執(zhí)行,可能同時(shí)執(zhí)行,也可能不是,我們只關(guān)心在一段時(shí)間內(nèi),哪怕是很短的時(shí)間(一秒或者兩秒)是否執(zhí)行解決了兩個(gè)或兩個(gè)以上任務(wù)。 并行(parallellism):兩個(gè)或兩個(gè)以上的任務(wù)在同一時(shí)刻…
-
使用 Go 語(yǔ)言實(shí)現(xiàn)漢諾塔(Hanota)算法
我最近重溫了一下《猩球崛起》這部電影。在電影中,凱撒就玩了河內(nèi)塔游戲。你還有印象嗎?其實(shí)獨(dú)自一人玩一些游戲是好難的??(譯者不知作者為何這么說(shuō)??,難道是無(wú)聊嘛???),今天我們就用 Golang 來(lái)實(shí)現(xiàn)一下漢諾塔游戲。 游戲起源 相傳最早發(fā)明這個(gè)問(wèn)題的人是法國(guó)數(shù)學(xué)家愛德華·盧卡斯(Edouard Lucas)。 在世界中心的貝拿勒斯(印度北部)圣殿中,有三根寶石針插入了一個(gè)黃銅盤中。在印度教主神梵天(Brahma)創(chuàng)世時(shí),將其中一根針上從下到上裝配了 64 個(gè)金片,這也就是所謂的漢諾塔。 無(wú)論白天黑…
-
Go語(yǔ)言 如何配制 高性能sql.DB 的
有很多教程是關(guān)于Go的sql.DB類型和如何使用它來(lái)執(zhí)行SQL數(shù)據(jù)庫(kù)查詢的。但大多數(shù)內(nèi)容都沒(méi)有講述SetMaxOpenConns(),?SetMaxIdleConns()?和?SetConnMaxLifetime()方法, 您可以使用它們來(lái)配置sql.DB的行為并改變其性能。 在本文我將詳細(xì)解釋這些設(shè)置的作用,并說(shuō)明它們所能產(chǎn)生的(積極和消極)影響。 開放和空閑連接 一個(gè)sql.DB對(duì)象就是一個(gè)數(shù)據(jù)庫(kù)連接池,它包含“正在用”和“空閑的”連接。一個(gè)正在用的連接指的是,你正用它來(lái)執(zhí)行數(shù)據(jù)庫(kù)任務(wù),例如…
-
如何確定一個(gè) Go 變量會(huì)被分配在哪里?
本文作者記錄了 Go 變量分配位置的觀測(cè)技巧和 Go 語(yǔ)言設(shè)計(jì)思路。 一、由 iter 包引發(fā)的疑問(wèn) 最近在 GitHub 上偶然發(fā)現(xiàn)了 Brad Fitzpatrick 的 iter 包,整個(gè)包只有 一個(gè)函數(shù)(一行代碼): 但其中的一行注釋令人費(fèi)解: It does not cause any allocations. 1. 空結(jié)構(gòu)體 我們知道,struct{} 是空結(jié)構(gòu)體(empty struct)。關(guān)于空結(jié)構(gòu)體,Dave Cheney 在 The empty struct 中作了很好地闡述…
-
深入理解Golang Channel 結(jié)構(gòu)
Go 語(yǔ)言的 channel 底層是什么數(shù)據(jù)結(jié)構(gòu)?本文深入解析了 channel。 Golang 使用 Groutine 和 channels 實(shí)現(xiàn)了 CSP(Communicating Sequential Processes) 模型,channles?在 goroutine 的通信和同步中承擔(dān)著重要的角色。 在 GopherCon 2017 中,Golang 專家 Kavya 深入介紹了 Go Channels 的內(nèi)部機(jī)制,以及運(yùn)行時(shí)調(diào)度器和內(nèi)存管理系統(tǒng)是如何支持 Channel 的,本文根…
-
七步制作精簡(jiǎn)鏡像
目錄 介紹 鏡像層(Layers) 制作步驟 lab-1:初始化構(gòu)建 Redis 鏡像 lab-2:優(yōu)化基礎(chǔ)鏡像 lab-3:串聯(lián) Dockerfile 指令 lab-4:壓縮你的鏡像 lab-5:使用最精簡(jiǎn)的 base image lab-6:提取動(dòng)態(tài)鏈接的 .so 文件 lab-7:為 Go 應(yīng)用構(gòu)建精簡(jiǎn)鏡像 總結(jié) 參考 介紹 前段時(shí)間網(wǎng)易蜂巢曾經(jīng)推出蜂巢?Logo?T恤,用的正是 Docker 鏡像制作,最神奇的是,它最終的鏡像大小只有?585?字節(jié)。 有些鏡像都不是我們自己來(lái)打包的(比如…
-
淺談 Golang 鎖的應(yīng)用: sync包
Go 語(yǔ)言 sync 包中的鎖都在什么場(chǎng)景下用?怎么用?本文對(duì) sync 包內(nèi)的鎖做了梳理。 今天談一下鎖,以及 Go 里面 Sync 包里面自帶的各種鎖,說(shuō)到鎖這個(gè)概念,在日常生活中,鎖是為了保護(hù)一些東西,比如門鎖、密碼箱鎖,可以理解對(duì)資源的保護(hù)。在編程里面,鎖也是為了保護(hù)資源,比如說(shuō)對(duì)文件加鎖,同一時(shí)間只也許一個(gè)用戶修改,這種鎖一般叫作文件鎖。 實(shí)際開發(fā)中,鎖又可分為互斥鎖(排它鎖)、讀寫鎖、共享鎖、自旋鎖,甚至還有悲觀鎖、樂(lè)觀鎖這種說(shuō)法。在 Mysql 數(shù)據(jù)庫(kù)里面鎖的應(yīng)用更多,比如行鎖、表…
-
Golang 閉包的實(shí)現(xiàn)
什么是閉包?什么場(chǎng)景下會(huì)用閉包?本文對(duì)?go 語(yǔ)言中的閉包做了詳細(xì)介紹。 閉包是由函數(shù)及其相關(guān)引用環(huán)境組合而成的實(shí)體(即:閉包=函數(shù)+引用環(huán)境)。 Go中的閉包 閉包是函數(shù)式語(yǔ)言中的概念,沒(méi)有研究過(guò)函數(shù)式語(yǔ)言的用戶可能很難理解閉包的強(qiáng)大,相關(guān)的概念超出了本書的范圍。Go語(yǔ)言是支持閉包的,這里只是簡(jiǎn)單地講一下在Go語(yǔ)言中閉包是如何實(shí)現(xiàn)的。 函數(shù)f返回了一個(gè)函數(shù),返回的這個(gè)函數(shù),返回的這個(gè)函數(shù)就是一個(gè)閉包。這個(gè)函數(shù)中本身是沒(méi)有定義變量i的,而是引用了它所在的環(huán)境(函數(shù)f)中的變量i。 c1跟c2引用…
-
Go 可變參數(shù) ... parameters 讀這篇就夠了
Go 語(yǔ)言可變參數(shù)怎么用能最大化它的效用?本文對(duì)可變參數(shù)進(jìn)行了詳細(xì)介紹。 在實(shí)際開發(fā)中,總有一些函數(shù)的參數(shù)個(gè)數(shù)是在編碼過(guò)程中無(wú)法確定的,比如我們最常用的 fmt.Printf 和 fmt.Println: 當(dāng)你需要實(shí)現(xiàn)類似的接口時(shí),就需要我們的可變參數(shù)出場(chǎng)了。 golang 的可變參數(shù) 可變參數(shù)就是一個(gè)占位符,你可以將 1 個(gè)或者多個(gè)參數(shù)賦值給這個(gè)占位符,這樣不管實(shí)際參數(shù)的數(shù)量是多少,都能交給可變參數(shù)來(lái)處理,我們看一下可變參數(shù)的聲明: 可變參數(shù)使用 name ...Type 的形式聲明在函數(shù)的參…
-
深入淺出標(biāo)準(zhǔn)庫(kù) text/template 包
go 語(yǔ)言標(biāo)準(zhǔn)庫(kù) text/template 在 web 編程項(xiàng)目中經(jīng)常用到,本文詳細(xì)介紹了這個(gè)包的用法。 官方定義: Package template implements data-driven templates for generating textual output. template 包是數(shù)據(jù)驅(qū)動(dòng)的文本輸出模板,其實(shí)就是在寫好的模板中填充數(shù)據(jù)。 模板 什么是模板? 下面是一個(gè)簡(jiǎn)單的模板示例: {{ 和 }} 中間的句號(hào)?.?代表傳入模板的數(shù)據(jù),根據(jù)傳入的數(shù)據(jù)不同渲染不同的內(nèi)容。 .…