Go語言學(xué)習(xí)筆記,持續(xù)更新...

有興趣的小伙伴可以+vx一起學(xué)習(xí):lmomo7205

Go 學(xué)習(xí)筆記

Go語言變量和常量

1. 標(biāo)識符

在變成語言中標(biāo)識符就是程序員定義的具有特殊意義的詞姆怪,比如變量名叛赚、常量名、函數(shù)名等等稽揭。Go語言中標(biāo)識符由字母數(shù)字和_下劃線組成俺附,并且只能以字母和_開頭,比如abc溪掀、_事镣、_123、a123

2. 關(guān)鍵字

關(guān)鍵字是指變成語言中預(yù)先定義好的具有特殊含義的標(biāo)識符揪胃。關(guān)鍵字和保留字都不建議用做變量名璃哟。
  1. Go語言中有25個關(guān)鍵字

        break        default      func         interface    select
        case         defer        go           map          struct
        chan         else         goto         package      switch
        const        fallthrough  if           range        type
        continue     for          import       return       var
    
  2. 37個保留字段

       Constants:    true  false  iota  nil
    
            Types:    int  int8  int16  int32  int64  
                      uint  uint8  uint16  uint32  uint64  uintptr
                      float32  float64  complex128  complex64
                      bool  byte  rune  string  error
    
        Functions:   make  len  cap  new  append  copy  close  delete
                     complex  real  imag
                     panic  recover
    

3.變量

程序運(yùn)行過程中的數(shù)據(jù)都是保存在內(nèi)存中氛琢,我們想要在代碼中操作某個數(shù)據(jù)時就需要去內(nèi)存上找到這個變量,但是如果我們直接在代碼中通過內(nèi)存地址去操作變量的話随闪,代碼的可讀性會非常差而且還容易出錯阳似,所以我們就利用變量將這個數(shù)據(jù)的內(nèi)存地址保存起來,以后直接通過這個變量就能找到內(nèi)存上對應(yīng)的數(shù)據(jù)了铐伴。
***
Go語言中變量必須聲明后才能使用撮奏,同意作用域內(nèi)不支持重復(fù)聲明,并且變量聲明后必須使用当宴,不然會報錯
  1. 變量標(biāo)準(zhǔn)聲明

    每聲明一個變量就要使用一個var

    var 變量名 變量類型 = var name string
    
  2. 批量聲明

    批量聲明可以使用一個var

    var (
    name string
    age int
    money float32
    )
    
  3. 變量的初始化

    Go語言在聲明變量的時候畜吊,會自動對變量對應(yīng)的內(nèi)存區(qū)域進(jìn)行初始化操作,每個變量會被初始化成其類型的默認(rèn)值即供,例如:int和float類型的變量初始值為0定拟,string的初始值為 空字符串,布爾類型默認(rèn)值為 false逗嫡,切片青自、函數(shù)、指針變量的默認(rèn)值為nil

    // 在聲明變量的時候可以指定初始值如下
    var 變量名 類型 = 表達(dá)式 = var name string = "Lmomo"
    // 一次是初始化多個變量驱证,有兩種方式
    1. var name,age ="Lmomo",20 //此種聲明會進(jìn)行推導(dǎo)類型
    2. var (
     name string = "lmomo"
        age int = 20
    )
    
  4. 類型推導(dǎo)

    聲明變量的時候可以省略類型延窜,此時Go語言會根據(jù)=號右邊的值進(jìn)行推導(dǎo)類型

    var name ="Lmomo" // name類型為string
    
  5. 短變量聲明

    短變量聲明只能在局部變量中使用,可以使用:=方式聲明并初始化變量

    var m = 100 //全局變量
    func main(){
     n:=10
     m:=200 //此處為局部變量
    }
    
  6. 匿名變量

    使用多重賦值時抹锄,如果需要忽略某一個值逆瑞,可以使用匿名變量(anonymous variable)。匿名變量用一個下劃線_表示伙单,匿名變量不占用命名空間获高,不會分配內(nèi)存,所以匿名變量之間不存在重復(fù)聲明吻育。(在Lua等變成語言中念秧,匿名比那里也被稱作啞元變量)

    package main
    func foo()(int,string){ //無入?yún)ⅲ祷豬nt和string類型的兩個參數(shù)
     return 10,"Lmomo"
    }
    func main(){
     x,_:=foo() //值為10和空
     _,x:=foo() //值為空和Lmomo
    }
    
  7. 注意事項

    1. 函數(shù)外的每個語句都必須以關(guān)鍵字開始(var布疼、const瞭空、func等)
    2. :=不能在函數(shù)外使用撑刺,只做局部變量
    3. _多用于占位,表示忽略值

4.常量

對比變量聲明方式基本一致只是var換成了const,并且聲明必須賦值鞭缭,而且在程序運(yùn)行過沖中不能修改
// 幾種定義常量的方式
const name string ="Lmomo"
const name ="Lmomo"
const (
    name string = "Lmomo"
)
const(
    name ="Lmomo"
)
const(
    name ="Lmomo"
    name1 
    name2
    name3
    // name-name3值均為Lmomo
)
  1. iota

    iota是go語言的常量計算器鼻由,只能在常量的表達(dá)式中使用省骂。

    iota在const關(guān)鍵字中出現(xiàn)的時候?qū)⒈恢刂脼?惊橱,重復(fù)使用后以第一次使用時為準(zhǔn)

    const(
     number = iota //0
     number1 //1
     number2 //2
     number3 //3
    )
    const(
     number = iota //0
     number1 //1
     number2 = iota //2
     number3 //3
    )
    const(
     number = iota //0
     number1 = 100 //100
     number2 = iota //2
     number3 //3
    )
    const(
     number = iota //0
     number1 = 100 //100
     _
     number3 //2
    )
    

Go語言基本數(shù)據(jù)類型

整數(shù)

整型分為以下兩個大類: 按長度分為:int8、int16、int32铸董、int64 對應(yīng)的無符號整型:uint8祟印、uint16、uint32粟害、uint64

其中蕴忆,uint8就是我們熟知的byte型,int16對應(yīng)C語言中的short型悲幅,int64對應(yīng)C語言中的long型套鹅。

類型 描述
uint8 無符號 8位整型 (0 到 255)
uint16 無符號 16位整型 (0 到 65535)
uint32 無符號 32位整型 (0 到 4294967295)
uint64 無符號 64位整型 (0 到 18446744073709551615)
int8 有符號 8位整型 (-128 到 127)
int16 有符號 16位整型 (-32768 到 32767)
int32 有符號 32位整型 (-2147483648 到 2147483647)
int64 有符號 64位整型 (-9223372036854775808 到 9223372036854775807)

特殊整數(shù)型

類型 描述
uint 32位操作系統(tǒng)上就是uint32,64位操作系統(tǒng)上就是uint64
int 32位操作系統(tǒng)上就是int32汰具,64位操作系統(tǒng)上就是int64
uintptr 無符號整型卓鹿,用于存放一個指針

注意: 在使用intuint類型時,不能假定它是32位或64位的整型留荔,而是考慮intuint可能在不同平臺上的差異吟孙。

注意事項 獲取對象的長度的內(nèi)建len()函數(shù)返回的長度可以根據(jù)不同平臺的字節(jié)長度進(jìn)行變化。實(shí)際使用中聚蝶,切片或 map 的元素數(shù)量等都可以用int來表示杰妓。在涉及到二進(jìn)制傳輸、讀寫文件的結(jié)構(gòu)描述時碘勉,為了保持文件的結(jié)構(gòu)不會受到不同編譯目標(biāo)平臺字節(jié)長度的影響巷挥,不要使用intuint

浮點(diǎn)型

Go語言支持兩種浮點(diǎn)型數(shù):float32float64验靡。這兩種浮點(diǎn)型數(shù)據(jù)格式遵循IEEE 754標(biāo)準(zhǔn): float32 的浮點(diǎn)數(shù)的最大范圍約為 3.4e38倍宾,可以使用常量定義:math.MaxFloat32float64 的浮點(diǎn)數(shù)的最大范圍約為 1.8e308胜嗓,可以使用一個常量定義:math.MaxFloat64高职。

復(fù)數(shù)

complex64和complex128

var c1 complex64
c1 = 1 + 2i
var c2 complex128
c2 = 2 + 3i
fmt.Println(c1)
fmt.Println(c2)

復(fù)數(shù)有實(shí)部和虛部,complex64的實(shí)部和虛部為32位辞州,complex128的實(shí)部和虛部為64位初厚。

布爾值

Go語言中以bool類型進(jìn)行聲明布爾型數(shù)據(jù),布爾型數(shù)據(jù)只有true(真)false(假)兩個值孙技。

注意:

  1. 布爾類型變量的默認(rèn)值為false
  2. Go 語言中不允許將整型強(qiáng)制轉(zhuǎn)換為布爾型.
  3. 布爾型無法參與數(shù)值運(yùn)算排作,也無法與其他類型進(jìn)行轉(zhuǎn)換牵啦。

字符串

Go語言中的字符串以原生數(shù)據(jù)類型出現(xiàn),使用字符串就像使用其他原生數(shù)據(jù)類型(int妄痪、bool哈雏、float32、float64 等)一樣。 Go 語言里的字符串的內(nèi)部實(shí)現(xiàn)使用UTF-8編碼裳瘪。 字符串的值為雙引號(")中的內(nèi)容土浸,可以在Go語言的源碼中直接添加非ASCII碼字符,例如:

字符轉(zhuǎn)義符

Go 語言的字符串常見轉(zhuǎn)義符包含回車彭羹、換行黄伊、單雙引號、制表符等派殷,如下表所示还最。

轉(zhuǎn)義符 含義
\r 回車符(返回行首)
\n 換行符(直接跳到下一行的同列位置)
\t 制表符
\' 單引號
\" 雙引號
\\ 反斜杠

多行字符串

Go語言中要定義一個多行字符串時,就必須使用反引號字符:

s1 := `第一行
第二行
第三行
`
fmt.Println(s1)

反引號間換行將被作為字符串中的換行毡惜,但是所有的轉(zhuǎn)義字符均無效拓轻,文本將會原樣輸出。

字符串的常用操作

方法 介紹
len(str) 求長度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判斷是否包含
strings.HasPrefix,strings.HasSuffix 前綴/后綴判斷
strings.Index(),strings.LastIndex() 子串出現(xiàn)的位置
strings.Join(a[]string, sep string) join操作

byte和rune類型

組成每個字符串的元素叫做“字符”经伙,可以通過遍歷或者單個獲取字符串元素獲得字符扶叉。 字符用單引號(’)包裹起來,如:

var a := '中'
var b := 'x'

Go 語言的字符有以下兩種:

  1. uint8類型帕膜,或者叫 byte 型枣氧,代表了ASCII碼的一個字符。
  2. rune類型泳叠,代表一個 UTF-8字符作瞄。

當(dāng)需要處理中文、日文或者其他復(fù)合字符時危纫,則需要用到rune類型宗挥。rune類型實(shí)際是一個int32

Go 使用了特殊的 rune 類型來處理 Unicode种蝶,讓基于 Unicode 的文本處理更為方便契耿,也可以使用 byte 型進(jìn)行默認(rèn)字符串處理,性能和擴(kuò)展性都有照顧螃征。

// 遍歷字符串
func traversalString() {
    s := "hello沙河"
    for i := 0; i < len(s); i++ { //byte
        fmt.Printf("%v(%c) ", s[i], s[i])
    }
    fmt.Println()
    for _, r := range s { //rune
        fmt.Printf("%v(%c) ", r, r)
    }
    fmt.Println()
}

輸出:

104(h) 101(e) 108(l) 108(l) 111(o) 230(?) 178(2) 153() 230(?) 178(2) 179(3) 
104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河) 

因為UTF8編碼下一個中文漢字由3~4個字節(jié)組成搪桂,所以我們不能簡單的按照字節(jié)去遍歷一個包含中文的字符串,否則就會出現(xiàn)上面輸出中第一行的結(jié)果盯滚。

字符串底層是一個byte數(shù)組踢械,所以可以和[]byte類型相互轉(zhuǎn)換。字符串是不能修改的 字符串是由byte字節(jié)組成魄藕,所以字符串的長度是byte字節(jié)的長度内列。 rune類型用來表示utf8字符,一個rune字符由一個或多個byte組成背率。

修改字符串

要修改字符串话瞧,需要先將其轉(zhuǎn)換成[]rune[]byte嫩与,完成后再轉(zhuǎn)換為string。無論哪種轉(zhuǎn)換交排,都會重新分配內(nèi)存划滋,并復(fù)制字節(jié)數(shù)組。

func changeString() {
    s1 := "big"
    // 強(qiáng)制類型轉(zhuǎn)換
    byteS1 := []byte(s1)
    byteS1[0] = 'p'
    fmt.Println(string(byteS1))

    s2 := "白蘿卜"
    runeS2 := []rune(s2)
    runeS2[0] = '紅'
    fmt.Println(string(runeS2))
}

類型轉(zhuǎn)換

Go語言中只有強(qiáng)制類型轉(zhuǎn)換埃篓,沒有隱式類型轉(zhuǎn)換处坪。該語法只能在兩個類型之間支持相互轉(zhuǎn)換的時候使用。

強(qiáng)制類型轉(zhuǎn)換的基本語法如下:

T(表達(dá)式)

其中都许,T表示要轉(zhuǎn)換的類型稻薇。表達(dá)式包括變量、復(fù)雜算子和函數(shù)返回值等.

比如計算直角三角形的斜邊長時使用math包的Sqrt()函數(shù)胶征,該函數(shù)接收的是float64類型的參數(shù)塞椎,而變量a和b都是int類型的,這個時候就需要將a和b強(qiáng)制類型轉(zhuǎn)換為float64類型睛低。

func sqrtDemo() {
    var a, b = 3, 4
    var c int
    // math.Sqrt()接收的參數(shù)是float64類型案狠,需要強(qiáng)制轉(zhuǎn)換
    c = int(math.Sqrt(float64(a*a + b*b)))
    fmt.Println(c)
}

Go語言基礎(chǔ)之運(yùn)算符

運(yùn)算符用于程序執(zhí)行時的數(shù)學(xué)或邏輯運(yùn)算

運(yùn)算符

Go語言內(nèi)置的運(yùn)算符有:

1.算數(shù)運(yùn)算符
2.關(guān)系運(yùn)算符
3.邏輯運(yùn)算符
4.位運(yùn)算符
5.賦值運(yùn)算符

1.算數(shù)運(yùn)算符

運(yùn)算符 描述
+ 相加
- 相減
* 相乘
/ 相除
% 求余

注意: ++(自增)和--(自減)在Go語言中是單獨(dú)的語句,并不是運(yùn)算符钱雷。

package main
import "fmt"
func main(){
    a:=10
    b:=20
    fmt.Println(a+b) //30
    fmt.Println(a-b) //-10
    fmt.Println(a*b) //200
    fmt.Println(a/b) //0
    fmt.Println(a%b) //10
    a--
    fmt.Println(9)
    a++
    fmt.Println(11)
}

2.關(guān)系運(yùn)算符

運(yùn)算符 描述
== 檢查兩個值是否相等骂铁,如果相等返回 True 否則返回 False。
!= 檢查兩個值是否不相等罩抗,如果不相等返回 True 否則返回 False拉庵。
> 檢查左邊值是否大于右邊值,如果是返回 True 否則返回 False套蒂。
>= 檢查左邊值是否大于等于右邊值钞支,如果是返回 True 否則返回 False。
< 檢查左邊值是否小于右邊值操刀,如果是返回 True 否則返回 False烁挟。
<= 檢查左邊值是否小于等于右邊值,如果是返回 True 否則返回 False骨坑。
package main
import "fmt"
func main(){
    fmt.Println(10 > 2) // true
    fmt.Println(10 < 2) // false
    fmt.Println(10 != 2) // true
    fmt.Println(4 <= 5) //true
    fmt.Println(1 == 1) //true
    fmt.Println(1 != 2) //true
    fmt.Println(2 >= 2) //true
}

3.邏輯運(yùn)算符

運(yùn)算符 描述
&& 邏輯 AND 運(yùn)算符撼嗓。 如果兩邊的操作數(shù)都是 True,則為 True欢唾,否則為 False且警。
|| 邏輯 OR 運(yùn)算符。 如果兩邊的操作數(shù)有一個 True礁遣,則為 True振湾,否則為 False。
! 邏輯 NOT 運(yùn)算符亡脸。 如果條件為 True押搪,則為 False,否則為 True浅碾。
package main
import "fmt"
func main(){
    fmt.Println(10>5 && 5<7) // true
    fmt.Println(10>5 || 5>7) //true ,滿足其中一個即為true
    fmt.Println(!(10>5)) //false
}

4.位運(yùn)算符

位運(yùn)算符對整數(shù)在內(nèi)存中的二進(jìn)制進(jìn)行操作

運(yùn)算符 描述
& 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相與大州。 (兩位均為1才為1)
| 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相或。 (兩位有一個為1就為1)
^ 參與運(yùn)算的兩數(shù)各對應(yīng)的二進(jìn)位相異或垂谢,當(dāng)兩對應(yīng)的二進(jìn)位相異時厦画,結(jié)果為1。 (兩位不一樣則為1)
<< 左移n位就是乘以2的n次方滥朱。 “a<<b”是把a(bǔ)的各二進(jìn)位全部左移b位根暑,高位丟棄,低位補(bǔ)0徙邻。
>> 右移n位就是除以2的n次方排嫌。 “a>>b”是把a(bǔ)的各二進(jìn)位全部右移b位。

5.賦值運(yùn)算符

字面意思理解

運(yùn)算符 描述
= 簡單的賦值運(yùn)算符缰犁,將一個表達(dá)式的值賦給一個左值
+= 相加后再賦值
-= 相減后再賦值
*= 相乘后再賦值
/= 相除后再賦值
%= 求余后再賦值
<<= 左移后賦值
>>= 右移后賦值
&= 按位與后賦值
|= 按位或后賦值
^= 按位異或后賦值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淳地,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子帅容,更是在濱河造成了極大的恐慌颇象,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件并徘,死亡現(xiàn)場離奇詭異遣钳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)麦乞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門蕴茴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人路幸,你說我怎么就攤上這事荐开。” “怎么了简肴?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵晃听,是天一觀的道長。 經(jīng)常有香客問我砰识,道長能扒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任辫狼,我火速辦了婚禮初斑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膨处。我一直安慰自己见秤,他們只是感情好砂竖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹃答,像睡著了一般乎澄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上测摔,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天置济,我揣著相機(jī)與錄音,去河邊找鬼锋八。 笑死浙于,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挟纱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼樊销,長吁一口氣:“原來是場噩夢啊……” “哼整慎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起围苫,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裤园,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后剂府,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拧揽,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年腺占,在試婚紗的時候發(fā)現(xiàn)自己被綠了淤袜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡衰伯,死狀恐怖铡羡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情意鲸,我是刑警寧澤烦周,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怎顾,受9級特大地震影響读慎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜槐雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一夭委、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧募强,春花似錦株灸、人聲如沸崇摄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽配猫。三九已至,卻和暖如春杏死,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捆交。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工淑翼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人品追。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓玄括,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肉瓦。 傳聞我的和親對象是個殘疾皇子遭京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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