在《Go學習筆記一》中,我對Go語言中的基礎數據類型、控制結構作了總結,該篇筆記的動機來源於我實際工做中利用Go解決一些小問題。問題自己並不複雜,用Python或者Shell一樣能夠解決。純粹是爲了體驗及學習Golang.golang
另外,我在這邊文章中沒有對go的異常及錯誤處理作說明,由於這一塊內容不少,我會在後續的學習中單獨敘述,此處不表。web
在C語言中,數據結構+算法構成了程序的主題,咱們的主要工做也體如今經過對業務的分析,提煉實體,定義數據結構,定義一系列的函數對數據結構進行處理。算法
在C++中,函數更多的是體如今做爲類的方法存在。數據庫
在Go語言中,函數依然存在,可是定義的格式和C/C++稍有不一樣,可是核心未變。函數名,參數列表,返回值。json
func funcName(param1 type1, param2 type2, .....)(ret1 retType1, ret2 retType2 ...){ //業務邏輯處理 return value1, value2 }
通常狀況下咱們的參數是固定個數,但有時候也會出現可變參數,好比C語言中的printf就是,不過我在實際項目中用的不多。服務器
func printadd(content string, args ...int) { var sum = 0 for _, value := range args { sum += value } fmt.Print(content) fmt.Println(sum) }
格式上的差別很少說,有幾個注意點: go中函數可有多返回值,若是在C/C++中,可能須要放到一個結構體中,可是在C中不須要,對於不想要的返回值,用下劃線佔位便可;
go語言中能夠定義匿名函數,能夠在函數內部進行使用;網絡
在現實項目中,幾乎沒有不涉及到文件操做的。典型的操做有:數據結構
因此學習一門新的語言,要快上手,文件操做必定要關注,此處我羅列了幾個經常使用操做app
在C/C++中,咱們利用stat函數檢查文件狀態,用來判斷文件是否存在,在golang中,一樣如此;若是stat的過程當中出現錯誤,則文件不存在;不然文件存在。分佈式
func isFileExist(filePath string) bool{ _, err := os.Stat(filePath) if (err == nil){ return true }else{ return false } }
該代碼的核心思想是利用filepath的walk函數,遍歷咱們傳入的文件樹,每當遍歷到目錄或者文件的時候,都會觸發咱們傳入的回調函數,在回調中,咱們記錄下文件的路徑信息。最終返回一個文件路徑全部信息的集合。
func getFileList(dirPath string) ([]string, error) { filelist = make([]string, 100) err := filepath.Walk(dirPath, func(path string, f os.FileInfo, err error) error { if f == nil { return err } else if f.IsDir() == true { return nil } filelist = append(filelist, path) return nil }) return filelist, err }
讀文件在C語言中經常使用的方法是fopen, fread,打開文件後將數據讀入到用戶指定的緩衝區中,每每是帶有指針的操做。 此處我以從文件中讀取一行文本信息爲例,說明如何利用go來讀取文件信息。
package main import ( "bufio" "fmt" "io" "os" ) func main() { filename := "D:\\mylibs3\\CephS3.h" //打開文件 file, err := os.Open(filename) if err != nil { fmt.Println("open file failed") } defer file.Close() //按行讀取文件 rd := bufio.NewReader(file) for { line, err := rd.ReadString('\n') if err != nil || io.EOF == err { break } fmt.Println(line) } }
向文件寫數據,打開文件,寫入數據。 此處寫入數據有多種方式 a. 直接利用file寫入數據; b. 利用io,將file及要寫入的文件內容做爲參數傳入; c. 利用bufio建立Writer,再寫入數據;
import ( "fmt" "os" "io" "bufio" ) func writefile(filePath string){ file, err := os.OpenFile(filePath, os.O_CREATE | os.O_RDWR | os.O_APPEND, os.ModeType) if err != nil{ fmt.Println("文件打開失敗") return } defer file.Close() //方式1, 直接用file 寫入數據 file.WriteString("hello,world1.") //方式2, 利用io來寫數據 io.WriteString(file, "hello,world2") //方式3, 利用bufio寫數據 bf := bufio.NewWriter(file) bf.WriteString("hello, world3") bf.Flush() }
在現實項目中,幾乎沒有不涉及到網絡通訊的。訪問數據庫走網絡,訪問web服務器走網絡,各中間件一樣如此。不過通訊層次不同。
有的項目在TCP/IP層面設計二進制通訊協議; 有的基於json或者xml這種文件信息,走http協議; 在分佈式系統中,心跳,也要走通訊;因此有必要研究下這個語言對網絡通訊的支持。
此處利用http包,構建Get請求,並答應請求到的全部內容
func httpGet() { resp, err := http.Get("http://www.baidu.com") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { // handle error } fmt.Println(string(body)) }
http協議有多種操做,head, get, post, put, delete等。此處只作基本示例,就不一一說明了。
我以前基於sublime配置go語言的開發調試環境,後來發現IntelliJ IDEA竟然也有golang的插件,之前據說這是一款很牛逼的IDE.因此我仍是嘗試了一下,畢竟那年用visual stdio寫程序的日子,仍是讓人懷念的。附上安裝教程。