Go學習筆記二: 函數,文件操做及網絡通訊

Go學習筆記二: 函數,文件操做及網絡通訊

1.引言

在《Go學習筆記一》中,我對Go語言中的基礎數據類型、控制結構作了總結,該篇筆記的動機來源於我實際工做中利用Go解決一些小問題。問題自己並不複雜,用Python或者Shell一樣能夠解決。純粹是爲了體驗及學習Golang.golang

另外,我在這邊文章中沒有對go的異常及錯誤處理作說明,由於這一塊內容不少,我會在後續的學習中單獨敘述,此處不表。web

2.函數

在C語言中,數據結構+算法構成了程序的主題,咱們的主要工做也體如今經過對業務的分析,提煉實體,定義數據結構,定義一系列的函數對數據結構進行處理。算法

在C++中,函數更多的是體如今做爲類的方法存在。數據庫

在Go語言中,函數依然存在,可是定義的格式和C/C++稍有不一樣,可是核心未變。函數名,參數列表,返回值。json

func funcName(param1 type1, param2 type2, .....)(ret1 retType1, ret2 retType2 ...){

    //業務邏輯處理
    return value1, value2
}

2.1 可變參數

通常狀況下咱們的參數是固定個數,但有時候也會出現可變參數,好比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語言中能夠定義匿名函數,能夠在函數內部進行使用;網絡

3.文件操做

在現實項目中,幾乎沒有不涉及到文件操做的。典型的操做有:數據結構

  • 進程啓動,讀取配置文件
  • 讀寫日誌

因此學習一門新的語言,要快上手,文件操做必定要關注,此處我羅列了幾個經常使用操做app

3.1 檢查文件是否存在

在C/C++中,咱們利用stat函數檢查文件狀態,用來判斷文件是否存在,在golang中,一樣如此;若是stat的過程當中出現錯誤,則文件不存在;不然文件存在。分佈式

func isFileExist(filePath string) bool{
        _, err := os.Stat(filePath)

        if (err == nil){
                return true
        }else{
                return false
        }
}

3.2 獲取文件列表

該代碼的核心思想是利用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
}

3.3 讀文件

讀文件在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)
	}
}

3.4 寫文件

向文件寫數據,打開文件,寫入數據。 此處寫入數據有多種方式 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()
}

4. 網絡通訊

在現實項目中,幾乎沒有不涉及到網絡通訊的。訪問數據庫走網絡,訪問web服務器走網絡,各中間件一樣如此。不過通訊層次不同。
有的項目在TCP/IP層面設計二進制通訊協議; 有的基於json或者xml這種文件信息,走http協議; 在分佈式系統中,心跳,也要走通訊;因此有必要研究下這個語言對網絡通訊的支持。

4.1 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等。此處只作基本示例,就不一一說明了。

5.附錄

我以前基於sublime配置go語言的開發調試環境,後來發現IntelliJ IDEA竟然也有golang的插件,之前據說這是一款很牛逼的IDE.因此我仍是嘗試了一下,畢竟那年用visual stdio寫程序的日子,仍是讓人懷念的。附上安裝教程。

IDEA golang開發環境配置

IDEA下載連接

相關文章
相關標籤/搜索