本篇文章為大家展示了如何入門Golang開(kāi)發(fā),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
十年的東寧網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整東寧建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“東寧網(wǎng)站設(shè)計(jì)”,“東寧網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
switch 表達(dá)式 {
case 表達(dá)式1, 表達(dá)式2.....:
語(yǔ)句塊1
case 表達(dá)式3,表達(dá)式4.....:
語(yǔ)句塊2
default:
語(yǔ)句塊
}
1)Golang 中switch的case后可以匹配多個(gè)表達(dá)式,用逗號(hào)間隔
2)Golang中case語(yǔ)句塊后不需要break來(lái)顯示跳出,程序在匹配到后執(zhí)行完語(yǔ)句塊會(huì)自動(dòng)跳出switch
3)case后是一個(gè)表達(dá)式(即:常量、變量、一個(gè)有返回值的函數(shù)等)
4)case后面的表達(dá)式如果是常量,則要求不能重復(fù)
5)case后的各個(gè)表達(dá)式的值的數(shù)據(jù)類型,必須和switch的表達(dá)式數(shù)據(jù)類型一致
6)switch后可以不帶表達(dá)式,類似if-else分支,如
7)switch后也可以直接聲明/定義一個(gè)變量,分號(hào)結(jié)束,不推薦
8)switch穿透-fallthrough, 如果在case語(yǔ)句塊后增加fallthrough,則會(huì)繼續(xù)執(zhí)行下一個(gè)case,這也叫switch穿透
9)Type switch:switch語(yǔ)句還可被用于Type-switch來(lái)判斷某個(gè)interface變量中實(shí)際指向的變量類型,如下
1)for循環(huán)的幾種寫法
func main() { for i := 0; i <= 10; i++ { fmt.Println("你好") } }
func main() { var i int8 = 0 for i <= 10 { fmt.Println("你好") i++ } }
func main() { //死循環(huán),通常需要配合break一起使用 for { fmt.Println("你好") } }
2)Golang提供了for-range的方式,可以方便遍歷字符串和數(shù)組,如
func main() { var str string = "hello北京" //使用傳統(tǒng)的方式遍歷字符串 for i := 0; i < len(str); i++ { fmt.Printf("i:%d, val:%c\n", i, str[i]) } fmt.Println("---------------------------") //使用for-range方式遍歷字符串 for index, val := range str { fmt.Printf("index:%d, val:%c\n", index, val) } }
從輸出結(jié)果來(lái)看,使用傳統(tǒng)的方式遍歷會(huì)包含中文的字符串會(huì)出現(xiàn)亂碼,但是使用for-range的方式則正常
結(jié)論:傳統(tǒng)for循環(huán)遍歷字符串時(shí),是按字節(jié)來(lái)遍歷的,而for-range的方式是按字符來(lái)遍歷的
3)Golang中沒(méi)有while,do while語(yǔ)法
go語(yǔ)言的goto語(yǔ)句可以直接跳轉(zhuǎn)到程序中指定的行,一般不推薦使用goto語(yǔ)句,以免造成程序流程的混亂,使理解與調(diào)試程序都產(chǎn)生困難
func main() { fmt.Println("hello word1") goto label0 fmt.Println("hello word2") fmt.Println("hello word3") label0: fmt.Println("hello word4") }
func 函數(shù)名 (形參列表)(返回值類型列表){
語(yǔ)句塊
return 返回值列表
}
func cal(n1 float64, n2 float64, operation byte) float64 { var res float64 switch operation { case '+': res = n1 + n2 case '-': res = n1 - n2 case '*': res = n1 * n2 case '/': res = n1 / n2 default: fmt.Println("輸入錯(cuò)誤") } return res } func main() { var n1 float64 = 3.0 var n2 float64 = 2.0 var operation byte = '*' result := cal(n1, n2, operation) fmt.Println("result:", result) }
1)導(dǎo)入包的兩種方式
//方式1 import "fmt" //方式2 import ( "fmt" "project1/utils" )
2)在訪問(wèn)其他包函數(shù)、變量時(shí),其語(yǔ)法是 包名.函數(shù)名
import ( "fmt" "project1/utils" ) func main() { var n1 float64 = 3.0 var n2 float64 = 2.0 var operation byte = '+' result := utils.Cal(n1, n2, operation) fmt.Println("result:", result) }
3)如果包名太長(zhǎng),go支持給包名取別名,但是取別名后,原來(lái)的包名就不能在用了
import ( "fmt" //給包取別名 util "project1/utils" ) func main() { var n1 float64 = 3.0 var n2 float64 = 2.0 var operation byte = '+' result := util.Cal(n1, n2, operation) fmt.Println("result:", result) }
4)在同一個(gè)包下不能有相同的函數(shù)名(也不能有相同的全局變量名),否則報(bào)重復(fù)定義
5)如果要編譯成一個(gè)可執(zhí)行的程序文件,就需要將這個(gè)包聲明為main,即package main,如果你是寫一個(gè)庫(kù),那么包名可以自定義
1)函數(shù)的形參列表可以是多個(gè),返回值列表也可以是多個(gè)
2)如果返回值類型列表中只有一個(gè),那么可以省略括號(hào),如
func sum(n1 int, n2 int) int { return n1 + n2 }
3)如果返回多個(gè)值,在接收時(shí),希望忽略某個(gè)返回值,則使用 _ 符號(hào)來(lái)時(shí)占位忽略,如
func main() { res1, _ := SumAndSub(1, 2) fmt.Printf("res1:%v", res1) } func SumAndSub(n1 int, n2 int) (int, int) { sum := n1 + n2 sub := n1 - n2 return sum, sub }
4)形參列表與返回值列表的數(shù)據(jù)類型可以是基本類型與引用類型
5)函數(shù)名稱的首字母如果大寫表示是公開(kāi)的,可以被其他包訪問(wèn),如果首字母小寫表示私有的,不能被其他包使用
6)函數(shù)中的變量是局部的,函數(shù)外不可用
7)基本數(shù)據(jù)類型與數(shù)組默認(rèn)都是值傳遞的,即進(jìn)行值拷貝,在函數(shù)內(nèi)修改不會(huì)影響到原來(lái)的值
8)如果希望函數(shù)內(nèi)的變量能夠修改函數(shù)外的變量(這里的變量指的是基本數(shù)據(jù)類型),可以傳入變量的地址&,然后在函數(shù)內(nèi)通過(guò)指針的方式操作變量,從效果看這類似引用
9)go中函數(shù)不支持重載
10)在go中函數(shù)也是一種數(shù)據(jù)類型,可以賦值給一個(gè)變量,則該變量就是一個(gè)函數(shù)類型的變量了,通過(guò)該變量可以對(duì)函數(shù)調(diào)用,如
11)函數(shù)既然是一種數(shù)據(jù)類型,因此在go中函數(shù)可以作為形參,并且調(diào)用
12)為了簡(jiǎn)化數(shù)據(jù)類型定義,Go支持自定義數(shù)據(jù)類型
基本語(yǔ)法:type 自定義數(shù)據(jù)類型名稱 數(shù)據(jù)類型 //這相當(dāng)于一個(gè)別名,如自定義一個(gè)int的數(shù)據(jù)類型
自定義上面sum函數(shù)的數(shù)據(jù)類型
13)支持函數(shù)返回值命名,如
14)Go支持可變參數(shù),如
每一個(gè)源文件都可以包含一個(gè)init函數(shù),該函數(shù)會(huì)在main函數(shù)執(zhí)行前執(zhí)行,被go框架調(diào)用,一般用來(lái)做初始化工作
1)如果一個(gè)源碼文件中包含全局變量定義、init函數(shù)和main函數(shù),那么執(zhí)行的順序?yàn)椋喝肿兞慷x——>init函數(shù)——>main函數(shù)
Go支持匿明函數(shù),如果某個(gè)函數(shù)希望只調(diào)用一次,可以考慮使用匿明函數(shù)
1)方式1:在定義匿明函數(shù)時(shí)直接調(diào)用,如
2)方式2:將匿明函數(shù)賦給一個(gè)變量(函數(shù)變量),在通過(guò)該變量來(lái)調(diào)用匿明函數(shù)
3)全局匿明函數(shù)
將匿明函數(shù)賦給一個(gè)全局變量,那么這個(gè)匿明函數(shù)就成為了一個(gè)全局匿明函數(shù)
簡(jiǎn)單理解閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù),即定義在一個(gè)函數(shù)內(nèi)部的函數(shù),如
在項(xiàng)目中經(jīng)常需要?jiǎng)?chuàng)建資源(數(shù)據(jù)庫(kù)連接、文件句柄、鎖等),為了在函數(shù)執(zhí)行完畢后,及時(shí)釋放資源,go的設(shè)計(jì)者提供了defer(延時(shí)機(jī)制)
示例1
示例2,關(guān)閉文件資源
func main() { //關(guān)閉文件資源 file = openfile(文件名) defer file.close() //其他語(yǔ)句 }
在將defer語(yǔ)句放入到棧中時(shí),也會(huì)將相關(guān)的值拷貝同時(shí)入棧,如下
1)值傳遞
2)引用傳遞
其實(shí)不管是值傳遞還是引用傳遞,傳遞給函數(shù)的都是變量的副本,不同的是,值傳遞是值的拷貝,引用傳遞是地址的拷貝,一般來(lái)說(shuō)地址的拷貝效率高,因?yàn)閿?shù)據(jù)量小,而值拷貝決定值的數(shù)據(jù)的大小,數(shù)據(jù)越大,效率越低
1)統(tǒng)計(jì)字符串長(zhǎng)度,按字節(jié)統(tǒng)計(jì)使用內(nèi)建函數(shù)len(str)
2)字符串遍歷,同時(shí)處理包含中文的問(wèn)題 r := []rune(str)
3)字符串轉(zhuǎn)整數(shù),使用strconv.Atoi函數(shù)
4)整數(shù)轉(zhuǎn)字符串,使用strconv.Itoa函數(shù)
5)字符串轉(zhuǎn) []byte ,如 var b = []byte("hello")
6)[]byte轉(zhuǎn)字符串,如 str := string([]byte{97,98,99})
7)將10進(jìn)制轉(zhuǎn)換為2、8、16進(jìn)制的字符串使用strconv.FormatInt
8)判斷字符串中是否包含子串,使用strings.Contains
9)返回字符串中有幾個(gè)不重復(fù)的子串,如
10)判斷字符串是否相等
1)格式化日期,使用now.Format格式化日期,里面的日期規(guī)定必須是2006/01/02 15:04:05
2)格式化日期,使用fmt.Sprintf函數(shù)來(lái)格式化并返回一個(gè)字符串來(lái)實(shí)現(xiàn)
1)new:用來(lái)分配內(nèi)存,主要用來(lái)分配值類型,比如int、float32..... 返回的是指針
2)make:用來(lái)分配內(nèi)存,主要用來(lái)分配引用類型,比如channel、map.....
go語(yǔ)言追求簡(jiǎn)潔優(yōu)雅,所以在Go語(yǔ)言中不支持傳統(tǒng)的try...catch...finally這種處理,而是通過(guò)defer,panic,recover來(lái)處理異常,可以理解為go中可以拋出一個(gè)panic的異常,然后在defer中通過(guò)recover捕獲這個(gè)異常,然后做相應(yīng)處理
func test() { //使用defer + recover來(lái)捕獲和處理異常 defer func() { //使用recover來(lái)捕獲異常 err := recover() if err != nil { fmt.Println("出錯(cuò)了,cause is:", err) } }() i := 10 j := 0 fmt.Println(i/j) } func main() { test() fmt.Println("測(cè)試") }
Go程序中也支持自定義錯(cuò)誤,使用errors.New 和 panic內(nèi)置函數(shù)
1)errors.New("錯(cuò)誤信息"),會(huì)返回一個(gè)error類型的值,表示一個(gè)錯(cuò)誤
2)panic內(nèi)置函數(shù),接收一個(gè)interface{}類型的值作為參數(shù),可以接收error類型的變量,輸出錯(cuò)誤信息并退出。
上述內(nèi)容就是如何入門Golang開(kāi)發(fā),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。