1. 程式人生 > >Go語言初嘗

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" ) //加鎖,註意鎖要以指針的形式傳進來,不然只是拷