Golang的入門教程(四)

1: 變量逃逸

堆和棧各有優(yōu)缺點(diǎn),該怎么在變成中處理這個(gè)問題呢?
Go語言將這個(gè)過程整合到編譯器中,命名為"變量逃逸分析".這個(gè)技術(shù)由編譯器分析代碼的特征和代碼生命周期,決定應(yīng)該如何堆還是棧進(jìn)行內(nèi)存分配,即使程序員使用Go語言完成了整個(gè)工程后也不會(huì)感受到這個(gè)過程.

1.1: 逃逸分析

如何通過命令行分析變量逃逸,代碼如下

package main

import "fmt"

//本函數(shù)測試入口參數(shù)和返回值
func dummy(b int) int  {
    //聲明一個(gè)c賦值進(jìn)入?yún)?shù)并返回
    var c int
    c = b
    return c
}
//空函數(shù)什么也不做
func void()  {

}

func main() {

    //聲明a變量并打印
    var a int
    //調(diào)用void()函數(shù)
    void()
    //打印a變量的值和函數(shù)dummy()函數(shù)返回
    fmt.Println(a,dummy(0))

}

接著使用如下命令運(yùn)行上面的代碼:

 go run -gcflags "-m -l" main.go

ps:使用go run 運(yùn)行程序是,-gcflags參數(shù)是編譯參數(shù),其中-m表示進(jìn)行內(nèi)存分配分析,-l表示避免程序內(nèi)聯(lián),也就是避免進(jìn)行程序優(yōu)化.
運(yùn)行結(jié)果如下:

# command-line-arguments
./main.go:24:13: a escapes to heap
./main.go:24:21: dummy(0) escapes to heap
./main.go:24:13: main ... argument does not escape
0 0

第二行告知"main 的第24行的變量a逃逸到堆"
第三行告知"dummy(0)調(diào)用逃逸到堆"

1.2: 原則

在使用Go語言進(jìn)行編程時(shí),Go語言的設(shè)計(jì)者不希望開發(fā)者將精力放在內(nèi)存應(yīng)該分配在棧還是堆上的問題.編譯器會(huì)自動(dòng)幫助開發(fā)者完成這個(gè)糾結(jié)的選擇.但變量逃逸分析也是需要了解的一個(gè)編譯器技術(shù),這個(gè)技術(shù)不僅用于Go語言,在Java等語言的編譯器優(yōu)化上也使用了類似的技術(shù).
編譯器覺得變量應(yīng)該分配在堆和棧上的原則是:
變量是否被取地址
變量是否發(fā)生逃逸

2 Base64 編碼----電子郵件的基礎(chǔ)編碼格式

Base64 編碼是常見的對(duì)8比特字節(jié)碼的編碼方式之一. Base64 編碼可以使用64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù),電子郵件就是使用這種編碼!
Go語言的標(biāo)準(zhǔn)庫自帶了Base64編碼算法,通過幾行代碼就可以對(duì)數(shù)據(jù)進(jìn)行編碼,示例代碼如下:

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {

    // 需要處理的字符串
    message := "Away from keyboard. https://golang.org/"

    // 編碼消息
    encodedMessage := base64.StdEncoding.EncodeToString([]byte(message))

    // 輸出編碼完成的消息
    fmt.Println(encodedMessage)

    // 解碼消息
    data, err := base64.StdEncoding.DecodeString(encodedMessage)

    // 出錯(cuò)處理
    if err != nil {
        fmt.Println(err)
    } else {
        // 打印解碼完成的數(shù)據(jù)
        fmt.Println(string(data))
    }
}

將會(huì)打印出返回的字節(jié)數(shù)組轉(zhuǎn)換為字符串!

3 從INI配置文件中查詢需要的值

3.1 INI文件的格式

INI文件由多行文本組成,整個(gè)配置由"[]"拆分為多個(gè)"段".每個(gè)段中又以"="分割為"鍵"和"值".
INI文件以";"置于行首視為注釋.

3.2 從INI中取值的函數(shù)

代碼如下:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

// 根據(jù)文件名笤闯,段名袭厂,鍵名獲取ini的值
func getValue(filename, expectSection, expectKey string) string {

    // 打開文件
    file, err := os.Open(filename)

    // 文件找不到陨囊,返回空
    if err != nil {
        return ""
    }

    // 在函數(shù)結(jié)束時(shí)坞淮,關(guān)閉文件
    defer file.Close()

    // 使用讀取器讀取文件
    reader := bufio.NewReader(file)

    // 當(dāng)前讀取的段的名字
    var sectionName string

    for {

        // 讀取文件的一行
        linestr, err := reader.ReadString('\n')
        if err != nil {
            break
        }

        // 切掉行的左右兩邊的空白字符
        linestr = strings.TrimSpace(linestr)

        // 忽略空行
        if linestr == "" {
            continue
        }

        // 忽略注釋
        if linestr[0] == ';' {
            continue
        }

        // 行首和尾巴分別是方括號(hào)的摆寄,說明是段標(biāo)記的起止符
        if linestr[0] == '[' && linestr[len(linestr)-1] == ']' {

            // 將段名取出
            sectionName = linestr[1 : len(linestr)-1]

            // 這個(gè)段是希望讀取的
        } else if sectionName == expectSection {

            // 切開等號(hào)分割的鍵值對(duì)
            pair := strings.Split(linestr, "=")

            // 保證切開只有1個(gè)等號(hào)分割的簡直情況
            if len(pair) == 2 {

                // 去掉鍵的多余空白字符
                key := strings.TrimSpace(pair[0])

                // 是期望的鍵
                if key == expectKey {

                    // 返回去掉空白字符的值
                    return strings.TrimSpace(pair[1])
                }
            }

        }

    }

    return ""
}

func main() {

    fmt.Println(getValue("example.ini", "remote \"origin\"", "fetch"))

    fmt.Println(getValue("example.ini", "core", "hideDotFiles"))
}

輸出如下:

+refs/heads/*:refs/remotes/origin/*
dotGitOnly

getValue()函數(shù)的邏輯由4部分組成:即讀取文件,讀取行文本,讀取段和讀取鍵值組成;

入門教程(一):http://www.reibang.com/p/de26de7ca907
入門教程(二):http://www.reibang.com/p/55383fb62f4b
入門教程(三):http://www.reibang.com/p/4589b54e7151

后續(xù)會(huì)繼續(xù)更新~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末靶衍,一起剝皮案震驚了整個(gè)濱河市酪我,隨后出現(xiàn)的幾起案子司浪,更是在濱河造成了極大的恐慌嫌蚤,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件断傲,死亡現(xiàn)場離奇詭異脱吱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)认罩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門箱蝠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垦垂,你說我怎么就攤上這事宦搬。” “怎么了劫拗?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵间校,是天一觀的道長。 經(jīng)常有香客問我页慷,道長憔足,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任酒繁,我火速辦了婚禮滓彰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘州袒。我一直安慰自己揭绑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布郎哭。 她就那樣靜靜地躺著他匪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夸研。 梳的紋絲不亂的頭發(fā)上邦蜜,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音陈惰,去河邊找鬼畦徘。 笑死毕籽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的井辆。 我是一名探鬼主播关筒,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼杯缺!你這毒婦竟也來了蒸播?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤萍肆,失蹤者是張志新(化名)和其女友劉穎袍榆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塘揣,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡包雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亲铡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片才写。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奖蔓,靈堂內(nèi)的尸體忽然破棺而出赞草,到底是詐尸還是另有隱情,我是刑警寧澤吆鹤,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布厨疙,位于F島的核電站,受9級(jí)特大地震影響疑务,放射性物質(zhì)發(fā)生泄漏沾凄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一暑始、第九天 我趴在偏房一處隱蔽的房頂上張望搭独。 院中可真熱鬧婴削,春花似錦廊镜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虫溜,卻和暖如春雹姊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背衡楞。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工吱雏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓歧杏,卻偏偏與公主長得像镰惦,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子犬绒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354