Golang 基礎(chǔ)總結(jié)

一、簡(jiǎn)介

  • Go(又稱Golang)是Google開發(fā)的一種靜態(tài)、強(qiáng)類型膊存、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言

二隔崎、變量 & 常量

2.1 變量

  • 聲明var name type
  • 變量聲明后今艺,會(huì)自動(dòng)初始化

int 為 0,float 為 0.0爵卒,bool 為 false虚缎,string 為空字符串,指針為 nil

  • 命名規(guī)則遵循駱駝命名法
    var a, b int
    var p *int
    var f int = 99

    //批量
    var (
        c int
        d string
    )

    //簡(jiǎn)寫
    s := "string"
    x, y := 1.0, 2.0

    //值交換
    x, y = y, x

    fmt.Println(a, b, f, c, d, p, s, x, y) //0 0 99 0  <nil> string 2 1

  • 匿名變量
func getPoint() (int, int) {
    return 100, 200
}
    xPoint, _ := getPoint()
    _, yPoint := getPoint()
    fmt.Println(xPoint, yPoint)

2.2 常量

  • const關(guān)鍵字
  • 只能是布爾型钓株、數(shù)字型(整數(shù)型实牡、浮點(diǎn)型和復(fù)數(shù))和字符串型
  • 定義常量的表達(dá)式必須為能被編譯器求值的常量表達(dá)式
  • 聲明,類型可選
    const name [type] = value
  • iota

三轴合、基本數(shù)據(jù)類型

3.1 布爾型

  • 關(guān)鍵字bool
  • 值僅有true or false
  • 默認(rèn)值false
  • 存在短路行為创坞,既如果運(yùn)算符左邊的值可以確定整個(gè)布爾表達(dá)式的結(jié)果,則運(yùn)算符右邊不再執(zhí)行(同其他語(yǔ)言)

3.2 字符串

  • 關(guān)鍵字string
  • 默認(rèn)值為空
  • 值為任意數(shù)據(jù)的不可變字節(jié)序列
  • UTF-8 字符占位(ASCII上的字符占一個(gè)字節(jié)受葛,其他占兩個(gè)字節(jié))
  • 轉(zhuǎn)義字符
    \n換行符
    \r回車符
    \ttab 鍵
    \u 或 \UUnicode 字符
    \\反斜杠自身
  • 比較運(yùn)算符(==题涨、!=、<总滩、<=纲堵、>=、>)
  • 獲取大小len()
  • 字符串操作闰渔,借助于strings
str1 := "!"
//拼接
str := "Hello world" + str1
//索引
fmt.Println(str[0]) //72
//截取(取前不取后)
fmt.Println(str[0:4]) //hell
//是否包含
fmt.Println(strings.Contains(str, "hello")) //true
fmt.Println(strings.Contains(str, "h & k")) //false
//是否包含多個(gè)
fmt.Println(strings.ContainsAny(str, "h & k")) //true
//是否以子串開始
fmt.Println(strings.HasPrefix(str, "hello")) //true
//是否以子串結(jié)束
fmt.Println(strings.HasSuffix(str, "!")) //true
//大小寫
fmt.Println(strings.ToLower(str)) //hello world!
fmt.Println(strings.ToUpper(str)) //HELLO WORLD!
//獲取索引,查找不到返回-1
fmt.Println(strings.Index(str, "l")) //2
fmt.Println(strings.LastIndex(str, "l")) //9
//匹配多個(gè)字節(jié)組成的字符
fmt.Println(strings.IndexRune("城市花園", '花')) //6

//切片
fmt.Println(strings.Split(str, " ")) //[Hello world!]
//組合(元素類型為string)
fmt.Println(strings.Join(strings.Split(str, " "), " ")) //Hello world!
fmt.Println(strings.Join([]string{"a", "b", "c"}, ", ")) //a, b, c


//替換(參數(shù):源字符串席函,需要替換, 新字符串澜建, 匹配前n個(gè)記錄)
fmt.Println(strings.Replace(str, "world", "Jony", 1)) //Hello Jony!

  • 多行時(shí)必須使用反引號(hào)`向挖,既字符串字面量
var s string = `First line
    hello
    end line
    `
  • 類型轉(zhuǎn)換,strconv
num, _ := strconv.Atoi("10")
fmt.Println(num-1) //9

3.3 數(shù)值類型

整數(shù)
  • 有符號(hào)
    int炕舵、int8何之、int16、int32咽筋、int64
  • 無符號(hào)
    uint溶推、uint8、uint16奸攻、uint32蒜危、uint64、uintptr

注:int和uint會(huì)因編譯器和計(jì)算機(jī)硬件睹耐,大小會(huì)在 32bit 或 64bit 之間變化

浮點(diǎn)數(shù)
  • float32 EEE-754 32位浮點(diǎn)型數(shù)
  • float64 IEEE-754 64位浮點(diǎn)型數(shù)
復(fù)數(shù)
  • complex64 32 位實(shí)數(shù)和虛數(shù)
  • complex128 64 位實(shí)數(shù)和虛數(shù)

四辐赞、派生類型

4.1 指針(pointer)

  • 聲明
    var var_name *var-type
  • 取地址操作符&
  • 指針變量取指向地址保存數(shù)據(jù)操作符*
  • fmt.Printf打印內(nèi)存地址%f
  • 類型指針,允許對(duì)這個(gè)指針類型的數(shù)據(jù)進(jìn)行修改硝训,傳遞數(shù)據(jù)可以直接使用指針响委,而無須拷貝數(shù)據(jù)新思,類型指針不能進(jìn)行偏移和運(yùn)算
    data := "pointer data"
    ptr := &data
    fmt.Printf("%p\n", &data) //0xc00008a040
    fmt.Println(ptr) //0xc0000681e0
    fmt.Println(*ptr) //pointer data

    str := new(string)
    *str = "string data"
    fmt.Printf("%p\n", str) //0xc000098050
    fmt.Printf("%s\n", *str) //string data

    //空指針取值會(huì)報(bào)錯(cuò)
    var nullPointer *string
    if(nullPointer == nil) {
        fmt.Println(nullPointer) //<nil>
    }

4.2 數(shù)組

  • 聲明
    var 數(shù)組變量名 [元素?cái)?shù)量]Type
  • 定長(zhǎng)特定類型的元素序列
    var intArr [3]int
    var arr1 [3]int = [3]int{1, 2} 
    arr2 := [...]int{1, 2, 0}
    arr3 := [2]int{1, 2}

    fmt.Println(intArr) //[0 0 0]
    fmt.Println(arr1) //[1 2 0]
    fmt.Println(arr2) //[1 2 0]
    fmt.Println(arr1 == arr2) //true
    // fmt.Println(arr1 == arr3) //error

    //數(shù)組遍歷
    for k, v := range arr3 {
        fmt.Println(k, v)
    }

    //多維數(shù)組
    var multArr [2][3]int
    //此種方式初始化一行的元素可以省略自動(dòng)使用默認(rèn)值,但不能省略一行否則報(bào)錯(cuò)
    multArr = [2][3]int{{1, 2, 3}, {4, 5}} //[[1 2 3] [4 5 0]]
    fmt.Println(multArr)

    multArr1 := [4][3]int{1:{1, 1, 1}, 3:{3, 3, 3}}
    fmt.Println(multArr1) //[[0 0 0] [1 1 1] [0 0 0] [3 3 3]]
    fmt.Println(multArr1[3]) //[3 3 3]
    multArr1[2][1] = 99
    fmt.Println(multArr1) //[[0 0 0] [1 1 1] [0 99 0] [3 3 3]]

4.3 切片

  • 切片(slice)是對(duì)數(shù)組的一個(gè)連續(xù)片段(整個(gè)數(shù)組赘风,由起始和終止索引標(biāo)識(shí)的一些項(xiàng)的子集)的引用(對(duì)數(shù)組的抽象)
  • 切片結(jié)構(gòu)包含地址夹囚、大小和容量
  • 大小不固定
  • 聲明
    var name []Type
    //從數(shù)組中生成切片
    arr := [...]int{1, 2, 3, 4, 5}
    fmt.Println(arr) //[1 2 3 4 5]
    fmt.Println(arr[0:0]) //[]
    fmt.Println(arr[:]) //[1 2 3 4 5]
    fmt.Println(arr[2:]) //[3 4 5]
    fmt.Println(arr[:2]) //[1 2]
    fmt.Println(arr[1:3]) //[2 3]

    //聲明切片
    var strSlice []string
    var intSlice []int
    var emptySlice = []int{} //分配到了內(nèi)存,但無元素
    fmt.Printf("%p, %p, %p\n", strSlice, intSlice, emptySlice) //0x0, 0x0, 0x1195ab8
    fmt.Println(strSlice, intSlice, emptySlice) //[] [] []
    fmt.Println(strSlice == nil) //true
    fmt.Println(emptySlice == nil) //false

    //append()函數(shù)添加元素邀窃,返回一個(gè)切片
    fmt.Println(append(intSlice, 1)) //[1]
    fmt.Println(append(intSlice, 1, 2)) //[1 2]
    //追加的為切片時(shí)需解包
    fmt.Println(append(intSlice, []int{1, 2, 3}...)) //[1 2 3]

    //使用 make() 內(nèi)建函數(shù),動(dòng)態(tài)地創(chuàng)建一個(gè)切片
    s1 := make([]int, 2)
    s2 := make([]int, 2, 6)
    fmt.Println(s1, s2) //[0 0] [0 0]

    //copy
    slice1 := []int{1, 1, 1}
    slice2 := []int{2, 2, 2, 2, 2}
    copySlice1 := make([]int, 5)
    copySlice2 := make([]int, 3)
    copy(copySlice1, slice1)
    copy(copySlice2, slice2)
    fmt.Println(copySlice1) //[1 1 1 0 0]
    fmt.Println(copySlice2) //[2 2 2]

4.4 Map

  • 聲明
    var mapname map[keytype]valuetype
    make聲明可選標(biāo)明大小make(map[keytype]valuetype, cap)
  • 僅只讀線程安全
    var emptyMap map[string]int
    emptyMap1 := make(map[string]int, 10)
    fmt.Println(emptyMap, emptyMap1) //map[] map[]

    mapList := map[string]int{"key1":1, "key2":2}
    fmt.Println(mapList, len(mapList)) //map[key1:1 key2:2] 2
    mapList["key3"] = 3
    for key, value := range mapList {
        fmt.Println(key, value)
    }

    //刪除
    delete(mapList, "key2")
    fmt.Println(mapList) //map[key1:1 key3:3]

value 值
  • 實(shí)測(cè)為Map 或者切片時(shí)正確荸哟,為數(shù)組時(shí)報(bào)錯(cuò)
type Rcus struct {
    Id bson.ObjectId
    RoomNum string
    AirconMap map[string][]int
    DmMap map[string]int
}
    rcu := new(models.Rcus) //已經(jīng)初始化各個(gè)成員
    // rcu := &(models.Rcus)
    rcu.Id = bson.NewObjectId()
    rcu.RoomNum = "1204"

    //正確
    // ariconMap := make(map[string][]int)
    // aircon1 := []int{1, 2, 3, 4}
    // ariconMap["AC1"] = aircon1
    // ariconMap["AC2"] = []int{1, 2, 3, 4} 
    // rcu.AirconMap = ariconMap


    //正確
    // aircon := []int{1, 2, 3, 4}
    // rcu.AirconMap = map[string][]int{"ac":aircon}

    rcu.DmMap = map[string]int{"1":1}

    fmt.Println(rcu)
sync.Map
  • 優(yōu)于加鎖解決map線程安全,sync 包下的特殊結(jié)構(gòu)
  • 無須初始化瞬捕,直接聲明即可
    //sync package
    var syncMap sync.Map
    //存儲(chǔ)
    syncMap.Store("key1", 1)
    syncMap.Store("key2", 2)
    syncMap.Store("key3", 3)
    //獲取值
    fmt.Println(syncMap.Load("key2")) //2 true
    //刪除
    syncMap.Delete("key3")
    //遍歷
    syncMap.Range(func(k, v interface{}) bool {
        fmt.Println(k, v)
        return true //true 繼續(xù)鞍历,false 結(jié)束
    })

其他:函數(shù)、Channel山析、接口堰燎、結(jié)構(gòu)體

四掏父、常用標(biāo)準(zhǔn)庫(kù)

包名 功能
bufio 帶緩沖的 I/O 操作
bytes 實(shí)現(xiàn)字節(jié)操作
container 封裝堆笋轨、列表和環(huán)形列表等容器
crypto 加密算法
database 數(shù)據(jù)庫(kù)驅(qū)動(dòng)和接口
debug 各種調(diào)試文件格式訪問及調(diào)試功能
encoding 常見算法如 JSON、XML赊淑、Base64 等
flag 命令行解析
fmt 格式化操作
go Go語(yǔ)言的詞法爵政、語(yǔ)法樹、類型等陶缺〖匦可通過這個(gè)包進(jìn)行代碼信息提取和修改
html HTML 轉(zhuǎn)義及模板系統(tǒng)
image 常見圖形格式的訪問及生成
io 實(shí)現(xiàn) I/O 原始訪問接口及訪問封裝
math 數(shù)學(xué)庫(kù)
net 網(wǎng)絡(luò)庫(kù),支持 Socket饱岸、HTTP掺出、郵件、RPC苫费、SMTP 等
os 操作系統(tǒng)平臺(tái)不依賴平臺(tái)操作封裝
path 兼容各操作系統(tǒng)的路徑操作實(shí)用函數(shù)
plugin Go 1.7 加入的插件系統(tǒng)汤锨。支持將代碼編譯為插件,按需加載
reflect 語(yǔ)言反射支持百框∠欣瘢可以動(dòng)態(tài)獲得代碼中的類型信息,獲取和修改變量的值
regexp 正則表達(dá)式封裝
runtime 運(yùn)行時(shí)接口
sort 排序接口
strings 字符串轉(zhuǎn)換铐维、解析及實(shí)用函數(shù)
time 時(shí)間接口
text 文本模板及 Token 詞法器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柬泽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫁蛇,更是在濱河造成了極大的恐慌锨并,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睬棚,死亡現(xiàn)場(chǎng)離奇詭異第煮,居然都是意外死亡有决,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門空盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來书幕,“玉大人,你說我怎么就攤上這事揽趾√ɑ悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵篱瞎,是天一觀的道長(zhǎng)苟呐。 經(jīng)常有香客問我,道長(zhǎng)俐筋,這世上最難降的妖魔是什么牵素? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮澄者,結(jié)果婚禮上笆呆,老公的妹妹穿的比我還像新娘。我一直安慰自己粱挡,他們只是感情好赠幕,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著询筏,像睡著了一般榕堰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嫌套,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天逆屡,我揣著相機(jī)與錄音,去河邊找鬼踱讨。 笑死魏蔗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勇蝙。 我是一名探鬼主播沫勿,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼味混!你這毒婦竟也來了产雹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤翁锡,失蹤者是張志新(化名)和其女友劉穎蔓挖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馆衔,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘟判,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年怨绣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拷获。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡篮撑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出匆瓜,到底是詐尸還是另有隱情赢笨,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布驮吱,位于F島的核電站茧妒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏左冬。R本人自食惡果不足惜桐筏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拇砰。 院中可真熱鬧梅忌,春花似錦、人聲如沸毕匀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)皂岔。三九已至,卻和暖如春展姐,著一層夾襖步出監(jiān)牢的瞬間躁垛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工圾笨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留教馆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓擂达,卻偏偏與公主長(zhǎng)得像土铺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子板鬓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容