Go語言初嘗
對於語言設計之爭, 唯一需要牢記的一句話是: 如果把 C 變成 C++, 那麼 C 就消失了。
Go 是一個輕量級的簡潔的支援併發的語言, 可以用於探索性個人專案, 這是我想學這門語言的主要原因。 對於有一定程式設計經驗的人來說, 學習一種新語言的方式是, 先概覽下語言特性, 然後編寫一箇中等規模的程式, 儘可能地運用到大部分重要特性。
下面的程式用於計算一個目錄下所有檔案或目錄的大小。
package main import ( "fmt" "time" "os" "log" ) type ShortFileInfo struct { fileName string size int64 } func (fileInfo *ShortFileInfo) Desc() string { return fmt.Sprintf("{%s:%d}", fileInfo.fileName, fileInfo.size) } func produceFiles(dirName string) []os.FileInfo { path, err := os.Open(dirName) if err != nil { log.Fatal(err) } defer path.Close() fileInfos, err := path.Readdir(0); if err != nil { log.Fatal(err) } return fileInfos; } func procFile(fileInfo os.FileInfo, baseDirName string, channelBuffer chan ShortFileInfo) { var filesize int64 fileName := fileInfo.Name() if fileInfo.IsDir() { filesize = totalFilesizeInDir(fileInfo, baseDirName) } else { filesize = fileInfo.Size() } shortFileInfo := ShortFileInfo{fileName, filesize}; fmt.Println(time.Now().String() + " store: " + shortFileInfo.Desc()) channelBuffer <- shortFileInfo } func totalFilesizeInDir(fileInfo os.FileInfo, baseDirName string) int64 { var filesize int64 = 0 fileInfos := produceFiles(baseDirName + "\\" + fileInfo.Name()) for _, subfileInfo := range fileInfos { if subfileInfo.IsDir() { filesize += totalFilesizeInDir(subfileInfo, baseDirName + "\\" + fileInfo.Name()) } else { filesize += subfileInfo.Size() } } return filesize } func sleep(ns int) { time.Sleep(time.Duration(time.Second)*time.Duration(ns)) } const ( B int64 = 1 KB int64 = 1024 MB int64 = 1024*1024 GB int64 = 1024*1024*1024 TB int64 = 1024*1024*1024*1024 ) const formatF string = "%8.4f" func readableSize(sizeInBytes int64) string { switch { case B <= sizeInBytes && sizeInBytes < KB: return fmt.Sprintf("%dB", sizeInBytes) case KB <= sizeInBytes && sizeInBytes < MB: return fmt.Sprintf(formatF+"KB", float64(sizeInBytes)/float64(KB)) case MB <= sizeInBytes && sizeInBytes < GB: return fmt.Sprintf(formatF+"MB", float64(sizeInBytes)/float64(MB)) case GB <= sizeInBytes && sizeInBytes < TB: return fmt.Sprintf(formatF+"GB", float64(sizeInBytes)/float64(GB)) case TB <= sizeInBytes: return fmt.Sprintf(formatF+"TB", float64(sizeInBytes)/float64(TB)) default: return "0" } } func main() { baseDirName := "C:\\Users\\qin.shuq\\Desktop" fileList := produceFiles(baseDirName) fileNumber := len(fileList) channelBuffer := make(chan ShortFileInfo, fileNumber) fileInfoMap := make(map[string] int64, fileNumber) for _, fileInfo := range fileList { go procFile(fileInfo, baseDirName, channelBuffer) } for count := 0 ; count <= fileNumber ; { select { case fileInfo := <- channelBuffer: fmt.Println(time.Now().String() + " fetch: " + fileInfo.Desc()) fileInfoMap[fileInfo.fileName] = fileInfo.size count++ default: if count == fileNumber { close(channelBuffer) } fmt.Println("Waiting for data ...") sleep(2) } } var totalSize int64 totalSize = 0 for _ , filesize := range fileInfoMap { totalSize += filesize } fmt.Printf("Total size in %s:%dB %s", baseDirName , totalSize, readableSize(totalSize)); }
相關推薦
Go語言初嘗
對於語言設計之爭, 唯一需要牢記的一句話是: 如果把 C 變成 C++, 那麼 C 就消失了。 Go 是一個輕量級的簡潔的支援併發的語言, 可以用於探索性個人專案, 這是我想學這門語言的主要原因。 對於有一定程式設計經驗的人來說, 學習
go語言初體驗
println add 數據 duration 頭文件 原來 ket mil turn 背景 目前後臺業務系統的大部分接口都是以同步阻塞式的方式工作,資源利用率低,單機qps有限。因為go語言原生支持協程,能夠同時滿足開發效率和程序性能,於是決定引入go語言進行改造。 主要
go語言初體驗(流程控制、range遍歷、函式、結構體、面向物件)
一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x { case 1: fmt.Print("beifeng 1") case 2:
go語言初體驗(流程控制、range遍歷、函數、結構體、面向對象)
需要 3.3 fmt float compute 捕獲異常 value 地址 異常處理 一、流程控制 // main package main import ( "fmt" ) func main() { x := 2 switch x {
Go語言初篇
cas 並且 new 包括 ace cloud Golan iot 增加 Go語言初篇 目錄 Go-開發環境 Go-語言基礎 Go-標準庫 Go-面向對象 Go-並發 Go-數據庫 Go-web框架 Go語言開發文檔:https://stu
《GO語言聖經》學習初感與建議
前言 今天剛看了《GO語言聖經》的前二十頁,感觸頗深,深感此書之精髓,令人歎服,決定從今日起,記錄下啃書的收穫與感悟,與君共勉!!! 在記錄中,我會有選擇的進行分享,對那些自我感覺比較關鍵的細細解讀,一些不是太重要的我就簡單略過了,以此節省大家的時間。有興趣的小夥伴可以邊看書邊看我的部落
IBM的雲平臺Bluemix使用初體驗——建立Go語言 Web 應用程式,新增並使用語言翻譯服務
概述通過本文學習,你將能夠在IBM的雲平臺Bluemix上建立自己的Go語言 Web 應用程式,新增並使用語言翻譯服務,釋出自己的GO語言Web應用到雲伺服器上。本地開發測試環境:Windows 7 x64,Go,與其它Web後端語言不同,Go語言需要自己編寫Web伺服器。有
我的Go語言學習之旅二:入門初體驗 Hello World
好吧,所有的程式設計師們都已經習慣了,學習任何一門語言,我們都會以Hello World例項開始我們的學習,我也不例外。先來一個簡單的例子 開啟編輯器 (可以用記事本,我已經習慣 Notepad++了)輸入以下內容 package main import
GO語言學習筆記(三)初寫GO程序
ffffff darwin oss 雙引號 標識 產生 1.5 運行 mar 一、第一個程序名稱:helloworld.go package main import "fmt" func main() { fmt.Println("hello world!"
go語言的初體驗
分享最近學習 Go 語言的心得和體會,適合有程式設計基礎的人,因為這裡只做經驗性的總結概述,不做基礎教學的入門知識講解,如果想要學習程式語言的基礎知識,請出門左轉進入官方文件,檢視基礎教學文件。 ### Go 概覽 ##### Go 的特徵 我經常說要學一樣東西,首先要搞清楚它為什麼會出現? 解決了
Go語言之嵌入類型
go 類型 嵌入類型,或者嵌套類型,這是一種可以把已有的類型聲明在新的類型裏的一種方式,這種功能對代碼復用非常重要。在其他語言中,有繼承可以做同樣的事情,但是在Go語言中,沒有繼承的概念。Go提倡的代碼復用的方式是組合,所以這也是嵌入類型的意義所在。組合而不是繼承,所以Go才會更靈活。type Rea
go語言的優點
程序編寫 執行文件 語言培訓 多線程 老男孩 老男孩教育go語言培訓是國內首家go語言培訓機構,主講老師是小米架構資深架構師,有多年go開發經驗。小編現將go語言優點整理如下,希望能幫到你們 1.部署簡單Go 編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其他外部依賴。這讓部署變
go語言筆記——append是內置的函數!!!new是一個函數!!!調試可以使用閉包,本質上是print調試,尼瑪!
... -c map blob 名稱 ebo bsp 處理機制 它的 內置函數 Go 語言擁有一些不需要進行導入操作就可以使用的內置函數。它們有時可以針對不同的類型進行操作,例如:len、cap 和 append,或必須用於系統級的操作,例如:panic。因此,它們需要直接
go語言筆記——切片函數常見操作,增刪改查和搜索、排序
通過 學習 strings 完整 官方文檔 二分 func fun 必須 7.6.6 搜索及排序切片和數組 標準庫提供了 sort 包來實現常見的搜索和排序操作。您可以使用 sort 包中的函數 func Ints(a []int) 來實現對 int 類型的切片排序。例如
go語言筆記——map map 默認是無序的,不管是按照 key 還是按照 value 默認都不排序
pcr 錯誤 固定 pre text 輸出結果 示例 operation frequency 示例 8.1 make_maps.go package main import "fmt" func main() { var mapLit map[string]int
GO語言 --socket.io
broadcast logfile hub println ogg sta out his ror socket.io是對websocket的封裝以及擴展, 可以跨平臺使用, 具體可看官網.. GO語言實現: package main import (
Go語言之標誌符可見性
goGo的標誌符,這個翻譯覺得怪怪的,不過還是按這個起了標題,可以理解為Go的變量、類型、字段等。這裏的可見性,也就是說那些方法、函數、類型或者變量字段的可見性。比如哪些方法不想讓另外一個包訪問,我們就可以把它們聲明為非公開的;如果需要被另外一個包訪問,就可以聲明為公開的,和Java語言裏的作用域類似。在Go
CentOS6.8配置GO語言開發環境
應用程序 編程語言 處理器 谷歌 export 導讀Go語言是谷歌2009發布的第二款開源編程語言,Go語言專門針對多處理器系統應用程序的編程進行了優化,使用Go編譯的程序可以媲美C或C++代碼的速度,而且更加安全、支持並行進程。 鑒於越來越多的開源項目都采用Go為開發語言,本文介紹Lin
奇妙的go語言(開始篇)
使用 turn row list strong input put content nds 【 聲明:版權全部。歡迎轉載,請勿用於商業用途。 聯系信箱:feixiaoxing @163.com】 從前接觸腳本語言不多,可是自從遇到go之後,就開始慢慢喜歡上了這個腳
go語言sync包的學習(Mutex、WaitGroup、Cond)
pri lee 拷貝 light 等待 runt broadcast 計算 混亂 package main; import ( "fmt" "sync" "runtime" "time" ) //加鎖,註意鎖要以指針的形式傳進來,不然只是拷