Golang 學(xué)習(xí)筆記(01)—— 基礎(chǔ)

本文為轉(zhuǎn)載茶凳,原文:Golang 學(xué)習(xí)筆記(01)—— 基礎(chǔ)

Golang

Golang介紹

Go語言是由Google開發(fā)的一個(gè)開源項(xiàng)目痒给,目的之一為了提高開發(fā)人員的開發(fā)效率。Go語言語法靈活、簡(jiǎn)潔并村、清晰、高效滓技。它的并發(fā)特性可以方便地用于多核處理器和網(wǎng)絡(luò)開發(fā)哩牍,同時(shí)靈活新穎的類型系統(tǒng)可以方便地編寫模塊化的系統(tǒng)。go可以快速編譯令漂,同時(shí)具有垃圾內(nèi)存自動(dòng)回收功能膝昆,并且還支持運(yùn)行時(shí)反射。Go是一個(gè)高效叠必、靜態(tài)類型荚孵,但是又具有解釋語言的動(dòng)態(tài)類型特征的系統(tǒng)級(jí)語法。

語言基礎(chǔ)

第一個(gè)go程序

我們學(xué)習(xí)每一門語言都少不了一個(gè)hello world的開始∥吵現(xiàn)在我們就獻(xiàn)上我們的第一個(gè)程序

package main
import "fmt"
func main(){
    fmt.Println("hello world")
}

運(yùn)行結(jié)果如我們所料:


代碼解釋

第一行收叶,package定義了程序包main。第二行共苛,引入了fmt包判没,func main()定義了main函數(shù),func是定義函數(shù)的關(guān)鍵字隅茎,在main函數(shù)中調(diào)用了fmt包中的Println方法輸出hello world字符串澄峰。

注意

  1. 在go語言中,語句末尾的分號(hào);是可以省略的
  2. 在go語言中辟犀,代碼片段的起始花括號(hào){不能換行俏竞,否則程序報(bào)錯(cuò)。

基本類型

類型 長(zhǎng)度(字節(jié)) 說明
bool 1 true, false踪蹬。 不能把非零值當(dāng)做true
byte 1 uint8 別名
rune 4 int32 別名胞此。代表一個(gè)Unicode字符
int/uint 4 依據(jù)所運(yùn)行的平臺(tái),可能是32bit或64bit跃捣。
int8/uint8 1 1-128 ~ 127; 0 ~ 255
int16/uint16 2 -32768 ~ 32767; 0 ~ 65535
int32/uint32 4 -21億 ~ 21億漱牵;0 ~ 42億
complex64 8 復(fù)數(shù)類型,即32位實(shí)數(shù)+32位虛數(shù)
complex128 16 復(fù)數(shù)類型疚漆,即64位實(shí)數(shù)+64位虛數(shù)
uintptr 能夠保存指針的32位或64位整數(shù)
array 數(shù)組酣胀,值類型刁赦,如:[2]int
struct 結(jié)構(gòu)體,值類型
string 值類型
slice 引用類型闻镶,如:[]int
map 引用類型
channel 引用類型
Interface 接口類型
function 函數(shù)類型

定義變量

package main
import "fmt"
func main(){
    var b bool //定義指定類型的變量
    var n int  //定義指定類型的變量
    var i int = 3 //定義指定類型的變量甚脉,并賦予默認(rèn)值
    var(          //多變量的定義
        aa int  = 4
        str string
    )
    var i1,i2,i3 int = 1,2,3 //多個(gè)同類型的變量定義,并賦值
    var strName = "bob"  //go會(huì)自動(dòng)檢測(cè)變量的類型
    strSex := "male"    //:=定義變量铆农,并給變量賦值牺氨,可省略var關(guān)鍵字
    fmt.Println("n = ", n)
    fmt.Println("i = ", i)
    fmt.Println("b = ", b)
    fmt.Println("aa = ", aa)
    fmt.Println("str = ", str)
    fmt.Println("i1 = ", i1, "i2 = ", i2, "i3 = ", i3)
    fmt.Println("strName = ", strName)
    fmt.Println("strSex = ", strSex)
}

編譯運(yùn)行:


你會(huì)發(fā)現(xiàn),b=false, n=0, str=; 對(duì)于未賦值的變量墩剖,Go會(huì)自動(dòng)初始化猴凹,數(shù)值類型為0,布爾類型為false岭皂,字符串類型為空郊霎。

注意:
在Go語言中定義了未使用的變量,編譯會(huì)報(bào)錯(cuò)爷绘;引入未使用的包編譯也會(huì)報(bào)錯(cuò)书劝。

常量

常量必須是編譯期能確定的,常量的定義使用const土至,常量的類型可以是char, string, bool數(shù)字常量购对。因?yàn)榫幾g態(tài)的限制,定義他們的表達(dá)式必須是常量表達(dá)式毙籽,可以被編譯器求值洞斯。例如,1<<3是常量表達(dá)式坑赡,math.Sin(math.Pi/4)不是烙如, 因?yàn)?code>math.Sin的函數(shù)調(diào)用發(fā)生在運(yùn)行態(tài)。

常量的定義與變量類似毅否,只是關(guān)鍵字變成了const

const PI = 3.1415926535
const msg = "hello"
const(
    z = false
    a = 123
)
const x, y = "xxxx", "yyyy"

go語言中沒有枚舉類型奋渔,可以用常量模擬蒿叠。可以用iota生成從0開始的自動(dòng)增長(zhǎng)的枚舉值。按行遞增没隘,可以省略后續(xù)行的iota關(guān)鍵字瘸洛。

const(
    Sunday = iota      //0
    Monday             //1
    TuesDay            //2
)

也可以在同一行使用多個(gè)iota守伸,他們各自增長(zhǎng)

const(
    U, V = iota, iota  //U=0,V=0
    W, X               //W=1,X=1
    Y, Z               //Y=2,Z=2
)

如果某行不想遞增斤吐,可單獨(dú)提供初始值。不過想要恢復(fù)遞增黍图,必須再次使用iota

const(
    A1 = iota //0
    A2        //1
    str = "hello"  //hello
    s              //沒有賦值曾雕,跟上一行一樣
    A3 = iota  //恢復(fù)遞增,值為4
    A4         //5
)

流程控制

if else

go的if與C和java中的是相似的助被,區(qū)別在于沒有小括號(hào)

func main(){
    a := 2
    if a==2{
        fmt.Println("a=2")
    }
}

在if和條件之間可以包括一些初始表達(dá)式剖张,以上代碼可以寫成:

func main(){
    if a := 2; a==2{
        fmt.Println("a=2")
    }
}

但是請(qǐng)記住切诀,if和條件之間只能有一個(gè)初始化表達(dá)式,否則會(huì)編譯報(bào)錯(cuò)搔弄。

Switch

go的switch非常靈活幅虑,表達(dá)式不必是常量或整數(shù),執(zhí)行的過程從上到下顾犹,直到找到匹配項(xiàng)倒庵;而如果switch沒有表達(dá)式,他會(huì)匹配true蹦渣。
go里面switch默認(rèn)相當(dāng)于每個(gè)case最后帶有break哄芜,匹配成功后不會(huì)自動(dòng)向下執(zhí)行其他case貌亭,而是跳出整個(gè)switch柬唯,但是可以使用fallthrough強(qiáng)制執(zhí)行后面的case代碼,fallthrough相當(dāng)于去掉了case后面默認(rèn)的break圃庭。

func main(){
    i := 5
    switch i{
        case 1:
            fmt.Println("i is equal to 1")
        case 2:
            fmt.Println("i is equal to 2")
        case 3,4,5,6:
            fmt.Println("i is equal to 3,4,5 or 6")
        default:
            fmt.Println("others")
    }
}

結(jié)果如下:


如果在最后一個(gè)case后面加上fallthrough

func main(){
    i := 5
    switch i{
        case 1:
            fmt.Println("i is equal to 1")
        case 2:
            fmt.Println("i is equal to 2")
        case 3,4,5,6:
            fmt.Println("i is equal to 3,4,5 or 6")
            fallthrough
        default:
            fmt.Println("others")
    }
}

結(jié)果如下锄奢,依然執(zhí)行了defaul內(nèi)的代碼:


不指定switch條件表達(dá)式,或直接為true時(shí)剧腻,可以替代if...else if...else...拘央,如:

func main(){
    i := 5
    switch {
        case i < 0:
            fmt.Println("小于零")
        case i > 0:
            fmt.Println("大于零")
        default:
            fmt.Println("等于零")
    }
}

結(jié)果:


for

go只有一個(gè)關(guān)鍵字用于引入循環(huán)。但它提供了除do-while外C語言當(dāng)中所以可用的循環(huán)方式书在。
go的for循環(huán)有如下三種形式:

for init; condition; post{} //和C的for一樣
for condition{}             //和while一樣
for{}                       //死循環(huán)

如:

func main(){
    str := "Chain"
    for i, j := 0, len(str); i < j; i++{
        fmt.Println(string(str[i]))
    }
}

運(yùn)行結(jié)果:


使用break可以提前終止當(dāng)前循環(huán)灰伟,嵌套循環(huán)時(shí),可以在break后面指定能夠標(biāo)簽儒旬,用來終止指定的循環(huán)栏账,如:

func main(){
    oute:
        for i := 0; i < 5; i ++{
            for j := 0; j < 3; j++{
                if(i > 2){
                    break oute
                }
                fmt.Println("i=",i,"j=", j)
            }
        }
}

結(jié)果:


continue用于終止本次循環(huán)體的執(zhí)行,繼續(xù)下一個(gè)循環(huán)栈源,與breck相同挡爵,對(duì)于嵌套循環(huán),可以用標(biāo)簽來指定要繼續(xù)哪一層循環(huán)甚垦。

本文為原創(chuàng)茶鹃,轉(zhuǎn)載請(qǐng)注明出處

目錄
下一節(jié):Golang 學(xué)習(xí)筆記(02)—— 函數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艰亮,隨后出現(xiàn)的幾起案子闭翩,更是在濱河造成了極大的恐慌,老刑警劉巖迄埃,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疗韵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡调俘,警方通過查閱死者的電腦和手機(jī)伶棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門旺垒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肤无,你說我怎么就攤上這事先蒋。” “怎么了宛渐?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵竞漾,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我窥翩,道長(zhǎng)业岁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任寇蚊,我火速辦了婚禮笔时,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仗岸。我一直安慰自己允耿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布扒怖。 她就那樣靜靜地躺著较锡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盗痒。 梳的紋絲不亂的頭發(fā)上蚂蕴,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音俯邓,去河邊找鬼骡楼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛看成,可吹牛的內(nèi)容都是我干的君编。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼川慌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼吃嘿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梦重,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤兑燥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后琴拧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體降瞳,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挣饥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片除师。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扔枫,靈堂內(nèi)的尸體忽然破棺而出汛聚,到底是詐尸還是另有隱情,我是刑警寧澤短荐,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布倚舀,位于F島的核電站,受9級(jí)特大地震影響忍宋,放射性物質(zhì)發(fā)生泄漏痕貌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一糠排、第九天 我趴在偏房一處隱蔽的房頂上張望舵稠。 院中可真熱鬧,春花似錦乳讥、人聲如沸柱查。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至研乒,卻和暖如春汹忠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背雹熬。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工宽菜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竿报。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓铅乡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親烈菌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阵幸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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