本文為轉(zhuǎn)載茶凳,原文:Golang 學(xué)習(xí)筆記(01)—— 基礎(chǔ)
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
字符串澄峰。
注意
:
- 在go語言中,語句末尾的分號(hào)
;
是可以省略的 - 在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)注明出處