Go 語(yǔ)言入門指南
學(xué)一門語(yǔ)言先看看helloworld吧,感覺(jué)go結(jié)合了好多語(yǔ)言的方式,寫起來(lái)一會(huì)像python一會(huì)像c++,java差不多。反正語(yǔ)法挺奇特
package main
import "fmt"
func main() {
fmt.Println("HelloWorld")
}
go語(yǔ)言特點(diǎn):
高性能、高并發(fā)
語(yǔ)法簡(jiǎn)單,學(xué)習(xí)曲線平緩
豐富的標(biāo)準(zhǔn)庫(kù)
完善的工具鏈
靜態(tài)鏈接
快速編譯
跨平臺(tái)
垃圾回收
首先聽(tīng)到老師說(shuō) go語(yǔ)言編譯賊快,1秒鐘左右,我(c++選手)聽(tīng)到簡(jiǎn)直大吃一驚啊,真神奇
基礎(chǔ)語(yǔ)法
首先go是強(qiáng)類型語(yǔ)言,每一個(gè)變量都有自己的變量類型,常見(jiàn)的有:字符串,整數(shù),浮點(diǎn)型,布爾類型,另外go中也有指針(只不過(guò)用法就是解引用和取地址)
go語(yǔ)言中字符串是內(nèi)置類型,可通過(guò)加號(hào)直接拼接,也同時(shí)能用等于號(hào)比較倆個(gè)字符串
下面是變量聲明及其定義
var name string // 聲明
var name string = "name" //聲明并賦初值
var name = "name" //自動(dòng)推導(dǎo)類型為string
name := "name" //也可以省略var 和類型直接自動(dòng)推導(dǎo)
/*其他類型同上幾乎差不多*/
分支結(jié)構(gòu)
if - else :
go 中的if - else和其他語(yǔ)言差不多,有些細(xì)節(jié)需要注意
if true{ // 花括號(hào)必須加
...
}else{ //else必須位于這里
}
// if - else if
if true{
...
}else if true{
...
}else{
...
}
switch-case
switch 中 可以放 變量,常量 ,字符串, case中也可以放表達(dá)式,用起來(lái)很是方便
switch v{
case 1 , 2 : // 可以并列 , 然后沒(méi)有break
case 3:
default:
}
switch {
case retInt() == v: //表達(dá)式
...
case v == 2:
...
default:
...
}
循環(huán)結(jié)構(gòu)
go 語(yǔ)言中只有一個(gè)for
for{ //類似 while(true)死循環(huán)
...
}
for i < 10{ //類似while(i < 10)
...
}
for i:=0; i < 10; i++{ //正常for循環(huán),三個(gè)表達(dá)式也可以省略,但是分號(hào)得在昂
...
}
數(shù)組
數(shù)組的話和其他語(yǔ)言類似,具有編號(hào)且長(zhǎng)度確定的元素序列
var a[5] int //聲明一個(gè)長(zhǎng)度為5的int型數(shù)組
b := [5]int{1,2,3,4,5} //聲明并定義
c := [...]int{1,2,3,4,5}//不想寫括號(hào)里的5也可以寫...來(lái)根據(jù)后面初始化的數(shù)量賦值
var twoD [2][3]int//二維數(shù)組
切片
go語(yǔ)言中一般很少用數(shù)組,用切片更方便一些
切片可以任意更改長(zhǎng)度
s := make([]string, 3) //創(chuàng)建一個(gè)切片 初始長(zhǎng)度為3
s[0] = "a"
s[1] = "b"
s[2] = "c"
s = append(s, "d") //數(shù)組不能用這個(gè)方法
fmt.Println(s) // [a b 3 d]
切片也可以這樣聲明,一開始總搞混切片和數(shù)組,其實(shí)就是切片方括號(hào)沒(méi)值而已,數(shù)組有值
var s []string //切片也可以這樣聲明
s = append(s, "a")
s = append(s, "b")
fmt.Println(s) // [a b]
現(xiàn)在解釋一一下為什么s = append(s, “a”)還需要在重新給s賦值呢,雖然切片可以動(dòng)態(tài)變長(zhǎng),其實(shí)切片底層是維護(hù)了一個(gè)數(shù)組的,也就是說(shuō)他初始上就是個(gè)數(shù)組,只不過(guò)有一定大小,如果你append添加元素沒(méi)有超過(guò)數(shù)組,那沒(méi)事,但是超過(guò)數(shù)組大小,他就會(huì)重新弄一個(gè)更大的數(shù)組然后把值拷貝進(jìn)去,最后把地址返回出來(lái),所以你得讓他重新等于s。(對(duì)于c++同學(xué)應(yīng)該是類似與vector的東東)
對(duì)切片可以有cap方法查看其底層數(shù)組大小 , len方法是真實(shí)元素個(gè)數(shù) var s []string s = append(s, "a") s = append(s, "b") s = append(s, "c") fmt.Println(s) fmt.Println(cap(s)) // 4 fmt.Println(len(s)) // 3
切片遍歷時(shí)也可以像python的切片一樣
s[0:len(s)] // 這樣使用
// 數(shù)組也可以 只不過(guò)數(shù)組一這樣用返回的類型也就是切片類型了
map
這個(gè)map和其他語(yǔ)言的hashmap、字典差不多
m := make(map[string]int , 3)//key是string value是int 初始大小設(shè)置為3 //也可以不設(shè)置
m["name"] = 2
fmt.Println(m["name"])
delete(m , "name")//在m中刪除key為name的
range
下面來(lái)介紹range。對(duì)于一個(gè) slice(切片) 或者一個(gè) map 的話,我們可以用 range 來(lái)快速遍歷,這樣代碼能夠更加簡(jiǎn)潔。 range 遍歷的時(shí)候,對(duì)于數(shù)組會(huì)返回兩個(gè)值,第一個(gè)是索引,第二個(gè)是對(duì)應(yīng)位置的值。如果我們不需要索引的話,我們可以用下劃線來(lái)忽略。
nums := []int{2, 3, 4}
sum := 0
for i, num := range nums { //返回?cái)?shù)組的 下標(biāo) 和值
sum += num
if num == 2 {
fmt.Println("index:", i, "num:", num) // index: 0 num: 2
}
}
fmt.Println(sum) // 9
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m { //返回key和value
fmt.Println(k, v) // a A; b B
}
for k := range m {//返回key
fmt.Println("key", k) // key a; key b
}
函數(shù)
這個(gè)是 Golang 里面一個(gè)簡(jiǎn)單的實(shí)現(xiàn)兩個(gè)變量相加的函數(shù)。 Golang 和其他很多語(yǔ)言不一樣的是,變量類型是后置的。Golang 里面的函數(shù)原生支持返回多個(gè)值。在實(shí)際的業(yè)務(wù)邏輯代碼里面幾乎所有的函數(shù)都返回兩個(gè)值,第一個(gè)是真正的返回結(jié)果,第二個(gè)值是一個(gè)錯(cuò)誤信息。
func add(a int , b int) int ,err {//a int , b int == a , b int倆種方式都一樣
return a + b //后面的是返回值
}
func add(a , b int)(int , error){ //可返回多個(gè)值
return a + b , nil
}
func Tmp(a , b int){
func() int {//還可以在函數(shù)內(nèi)部定義一個(gè)匿名函數(shù),類似別的語(yǔ)言lambda函數(shù)
return 5
}()//加上()表示直接調(diào)用
}
結(jié)構(gòu)體
type student struct { //定義方式 type + 名字 + struct
name string //小寫變量名相當(dāng)于私有,只有自己包的才可以訪問(wèn),
Age int //大寫變量名相當(dāng)于公有 , 外面包也可以訪問(wèn)
}
stus := []student{
{name: "小王子", Age: 18}, //可以指定變量成員賦值
{name: "大王八", Age: 9000},
{name: "娜扎", Age: 23},
}
結(jié)構(gòu)體函數(shù)
相比其他語(yǔ)言,結(jié)構(gòu)體成員函數(shù)是在外面定義的文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-605409.html
type person struct {
name, city string
age int8
}
// (接收者變量 接收者類型) 方法名(參數(shù)列表) (返回參數(shù))
// 不可修改成員的值
// 方法與函數(shù)的區(qū)別是,函數(shù)不屬于任何類型,方法屬于特定的類型。
func (p person) Dream() {
fmt.Printf("%s的夢(mèng)想是學(xué)好Go語(yǔ)言!\n", p.name)
}
// 可修改成員的值
func (p *person) SetAge(newAge int8) {
p.age = newAge
}
簡(jiǎn)單語(yǔ)法結(jié)構(gòu)就介紹這么多了,剩下的太多了慢慢介紹文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-605409.html
到了這里,關(guān)于Go 語(yǔ)言入門指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!