golang学习之旅
生活随笔
收集整理的這篇文章主要介紹了
golang学习之旅
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 1.基本熟悉,了解組成
- 2.整型,浮點(diǎn),字符串
- 3.字符串格式化
- 4.基礎(chǔ)數(shù)據(jù)類(lèi)型的擴(kuò)展
- 5.流程控制
- 6.函數(shù)
- 內(nèi)置函數(shù)
- 7.復(fù)合數(shù)據(jù)類(lèi)型
1.基本熟悉,了解組成
package main //main特殊包名,表示是一個(gè)可執(zhí)行程序 //導(dǎo)入代碼包,fmt import "fmt"//定于全局變量var var Pi float32 //顯式定義 var aname1="你好" var (a11=1a22="x" )//init函數(shù)是初始化實(shí)體 func init() {Pi=2+1 }//程序主體 func函數(shù) main程序主函數(shù) func main() { //注釋//單行注釋/*多行注釋*/fmt.Println("Hello word") //常量 定義使用const 數(shù)據(jù)類(lèi)型智能判斷const name string = "你好" //顯式定義const age int =123const name2 = "你好" //隱式定義const age2 = 456const name3 = "你" +"好"//:=賦值運(yùn)算符定義返回變量,但一定要被使用n := "hello"l := len(n)fmt.Println(l)//并行賦值const (Monday,Tuesday,Wednesday=1,2,3)//枚舉const (a = iota; //a===0bch="h")fmt.Println(c)//init函數(shù)使用DPi := Pifmt.Println(Pi,DPi) }2.整型,浮點(diǎn),字符串
package mainimport ("fmt""strings" )func main() {fmt.Println("你好")//數(shù)據(jù)類(lèi)型//整形const value_int_1 int =132value_int :=4fmt.Println(value_int,value_int_1)//浮點(diǎn)const value_float float32 =123.123value_float_1 := 123.1234fmt.Println(value_float,value_float_1)//復(fù)數(shù)(無(wú)需要,暫不了解)//字符和字符串str1:="1234567"fmt.Println("字符串長(zhǎng)度為:",len(str1))//遍歷獲取每個(gè)字符for i:=0;i<len(str1) ;i++ {//返回字節(jié)值fmt.Println("每個(gè)字符為",str1[i])fmt.Println("每個(gè)字符為",string(str1[i]))//獲取單個(gè)字符的值fmt.Printf("%d = %v\n",i+1,str1[i])}//非解釋字符串str2:="你好\n圣姑"fmt.Println(str2)str3:=`你好\n圣姑`fmt.Println(str3)//字符串修改 通過(guò)byte和rune類(lèi)型str_a1 :="hello word"str_a2 :=[]byte(str_a1) //自動(dòng)復(fù)制數(shù)據(jù)str_a2[5]=',' //修改下標(biāo)為5的值為,fmt.Printf("%s\n",str_a2)str_a3:=[]rune(str_a1)//轉(zhuǎn)runestr_a3[5] =','fmt.Println(string(str_a3)) //注意輸出的Println 并使用了string函數(shù)方法fmt.Println(string(str_a3[2])) //獲取最后一個(gè)字符//string包//1)判斷//前后綴包含str_b1 :="There is dongxi 你好"is_bool := strings.HasPrefix(str_b1,"Th") //HasPrefix判斷fmt.Println(is_bool) //返回值//字符串包含is_bool_1 := strings.ContainsAny(str_b1,"T")fmt.Println(is_bool_1) //返回值is_bool_2 := strings.ContainsAny(str_b1,"T & e")//多個(gè)配fmt.Println(is_bool_2) //返回值is_bool_3 := strings.ContainsAny(str_b1,"") //falsefmt.Println(is_bool_3) //返回值is_bool_4 := strings.Contains(str_b1,"T")fmt.Println(is_bool_4) //返回值is_bool_5 := strings.Contains(str_b1,"T & e") //無(wú)法多個(gè)配fmt.Println(is_bool_5) //返回值is_bool_6 := strings.Contains(str_b1,"") //truefmt.Println(is_bool_6) //返回值//2)索引//索引,返回索引值,開(kāi)頭索引值is_bool_7 := strings.Index(str_b1,"ere")fmt.Println(is_bool_7) //返回值fmt.Println("最后一次索引",strings.Index(str_b1,"x"))fmt.Println("最后一次索引",strings.Index(str_b1,"z"))fmt.Println("最后一次索引",strings.Index(str_b1,"你"))fmt.Println("最后一次索引",strings.IndexRune(str_b1,'你')) //非ASCII編碼配。一般無(wú)用 //3)替換str:="你好世界,世界good"println(strings.Replace(str,"你好","加油",1))//4)統(tǒng)計(jì)//出現(xiàn)頻率fmt.Printf("%d\n",strings.Count(str,"o"))//字符串?dāng)?shù)量fmt.Printf("%d\n",len([]rune(str)))//[]rune(str)轉(zhuǎn)字節(jié)fmt.Println(utf8.RuneCountInString(str)) //使用RuneCountInString函數(shù)做統(tǒng)計(jì)//5)大小寫(xiě)轉(zhuǎn)換str_e :="here is my"fmt.Println(strings.ToLower(str_e)) //全轉(zhuǎn)為小寫(xiě)fmt.Println(strings.ToUpper(str_e)) //全轉(zhuǎn)為大寫(xiě)//6)修剪fmt.Println(strings.Trim("!!! golang !!!","! "))//Trim使用fmt.Println(strings.Trim("!!! golang !!!"," !"))fmt.Println(strings.Trim("!!! golang !!!","!"))fmt.Println(strings.TrimLeft("!!! golang !!!","! "))//TrimLeft使用fmt.Println(strings.TrimRight("!!! golang !!!","! "))//TrimRight使用//7)分割//返回的是一個(gè)切片results:=strings.Split("a,c,d",",")fmt.Println(results)fmt.Println(string(results[0]))//8)插入字符strSli:=strings.Fields("a b c d") //Fields轉(zhuǎn)為切片strSli_2:=strings.Fields("你 的 名 子")for _,val:=range strSli{fmt.Printf("%s",val) //獲取每個(gè)切片的值}strStr2:=strings.Join(strSli,";") //join的連接符號(hào)為;fmt.Println(strStr2)//得到結(jié)果值fmt.Println(strSli_2) //獲得 }3.字符串格式化
| %% | %字面量 |
| %b | 一個(gè)二進(jìn)制整數(shù),將一個(gè)整數(shù)格式化為二進(jìn)制的表達(dá)方式 |
| %c | 一個(gè)Unicode的字符 |
| %d | 十進(jìn)制數(shù)值 |
| %o | 八進(jìn)制數(shù)值 |
| %x | 小寫(xiě)的十六進(jìn)制數(shù)值 |
| %X | 大寫(xiě)的十六進(jìn)制數(shù)值 |
| %U | 一個(gè)Unicode表示法表示的整型碼值,默認(rèn)是4個(gè)數(shù)字字符 |
| %s | 輸出以原生的UTF-8字節(jié)表示的字符,如果console不支持UTF-8編碼,則會(huì)輸出亂碼 |
| %t | 以true或者false的方式輸出布爾值 |
| %v | 使用默認(rèn)格式輸出值,或者如果方法存在,則使用類(lèi)型的String()方法輸出的自定義值 |
| %T | 輸出值的類(lèi)型 |
4.基礎(chǔ)數(shù)據(jù)類(lèi)型的擴(kuò)展
package mainimport "fmt"type (字符串 string )func main() {//1.強(qiáng)轉(zhuǎn)類(lèi)型sum:=11count:=3mean:=float32(sum)/float32(count)fmt.Printf("mean值為%f\n",mean)//2.自定義類(lèi)型。即結(jié)構(gòu)體,后面有詳解//3.類(lèi)型別名var b 字符串 //顯式聲明b="這是中文"fmt.Println(string(b))//4.指針//指針是一個(gè)內(nèi)存位置,每個(gè)內(nèi)存位置都有其定義的地址,可以使用&運(yùn)算符訪(fǎng)問(wèn)a:=10fmt.Printf("%x\n",&a)//*訪(fǎng)問(wèn)指針變量的值a1:=14ap:=&a1fmt.Printf("a1的地址%x\n",&a1)fmt.Printf("ap的地址%x\n",ap)fmt.Printf("*ap的值%d\n",*ap)//nil指針var ptr *intfmt.Printf("ptr的值是%x\n",ptr)//指針的指針a_n:=10aP:=&a_n //指針aPP:=&aP //指針的指針fmt.Printf("aP: %x\n",aP)fmt.Printf("aPP: %x\n",*aPP)fmt.Printf("aPP: %d\n",**aPP)//指針的數(shù)據(jù)a_list:=[]int{10,100,200}var p_a [3]*int //聲明指針數(shù)組for i:=0; i<3;i++ {p_a[i]=&a_list[i] //存儲(chǔ)指針的的內(nèi)存地址fmt.Printf("p_a[%d]的內(nèi)存地址:%x\n",i,p_a[i])}for i:=0; i<3;i++ {fmt.Printf("p_a[%d]的實(shí)際值:%d\n",i,*p_a[i])}//傳遞給函數(shù)a3:=100b3:=200fmt.Printf("交換之前的a,b值為%d,%d\n",a3,b3)swap(&a3,&b3)fmt.Printf("交換之后的a,b值為%d,%d\n",a3,b3)} func swap(x *int,y *int) { //指針作為函數(shù)參數(shù)var temp inttemp=*x*x=*y*y=temp }5.流程控制
package mainimport ("fmt""go/types""reflect" ) //空接口 var x interface{}func main() {//流程控制//1.條件語(yǔ)句a:=100if a>200 {fmt.Println("大于200")}else if a<200{fmt.Println("小于200")}else {fmt.Println("等于200")}//初始化子語(yǔ)句if b:=100;b<200{fmt.Println("小于200")}//2.選擇語(yǔ)句case_var:=90switch case_var {case 90:fmt.Println("是90")case 100:fmt.Println("是100")default:fmt.Println("啥也不是")}//switch二種用法switch {case case_var>100:fmt.Println("大于100")case case_var<100:fmt.Println("小于100")default:fmt.Println("啥也不是")}//switch三種用法,多表達(dá)switch_a:="A"switch_b:="B"switch {case switch_a=="A" && switch_b=="C":fmt.Println("等于A")case switch_a=="A" && switch_b=="B":fmt.Println("等于A和B")default:fmt.Println("啥也不是")}//類(lèi)型switchx=1switch i := x.(type) { //x.(type)只能用在switch中case types.Nil:fmt.Printf("這里是nif類(lèi)型,值是%T",i)case int:fmt.Printf("這里是int類(lèi)型,值是%T",i)case float64:fmt.Printf("這里是float64類(lèi)型,值是%T",i)case bool:fmt.Printf("這里是bool類(lèi)型,值是%T",i)case string:fmt.Printf("這里是string類(lèi)型,值是%T",i)default:fmt.Printf("未知類(lèi)型")}fmt.Printf("\n")//附錄fmt.Printf("v1的數(shù)據(jù)類(lèi)型為:%s\n", reflect.TypeOf(switch_a))//初始化語(yǔ)句switch case_var_1:=120;case_var_1 {case 90:fmt.Println("是90")case 120:fmt.Println("是120")default:fmt.Println("啥也不是")}//switch switch_c:="C"; {case switch_c=="A" :fmt.Println("等于A")case switch_c=="C" :fmt.Println("等于C")default:fmt.Println("啥也不是")}//select語(yǔ)句,暫時(shí)用不到,select隨機(jī)選擇一個(gè)case來(lái)判斷//3、循環(huán)語(yǔ)句for a:=0; a<5;a++ {fmt.Printf("當(dāng)前數(shù)值為%d\n",a)}//for的子語(yǔ)句a1:=0b1:=5for a1<b1 {fmt.Printf("當(dāng)前數(shù)值為%d\n",a1)a1++}//range子語(yǔ)句 類(lèi)似迭代器 輪詢(xún)數(shù)組或者切片的每一個(gè)元素 輪詢(xún)字符串的每一個(gè)字符 字典的鍵值對(duì) 通道類(lèi)型值元素str_a:="abcd"for i,char := range str_a{ //i為index char為具體值fmt.Printf("第%d個(gè)值是,具體值是%s\n",i,string(char))}for _,char := range str_a{ //_為忽略index char為具體值fmt.Printf("具體值是%s\n",string(char))}for i := range str_a{ //i為index 忽略獲取具體指fmt.Printf("第%d的下標(biāo)\n",i)}for range str_a{fmt.Printf("遍歷字符串,不做任何操作\n")}//range的字典和數(shù)組嘗試map_a:=map[string]int{"a":1,"b":2}for k,v:=range map_a {fmt.Printf("k值為%s,v值為%d\n",k,v)}//定義一個(gè)數(shù)據(jù)number_list:=[]int{1,2,3,4}for i,num:=range number_list {fmt.Printf("下標(biāo)值為%d,具體的值為%d\n",i,num)}number_list2:=[5]int{1,2,3,4}for i,num:=range number_list2 {fmt.Printf("下標(biāo)值為%d,具體的值為%d\n",i,num)}//4,延遲語(yǔ)句//defer用于延遲調(diào)用的指定函數(shù),defer關(guān)鍵字只出現(xiàn)在函數(shù)內(nèi)部//特點(diǎn):1.defer語(yǔ)句全部執(zhí)行,函數(shù)才算真正結(jié)束 2.函數(shù)等待defer語(yǔ)句結(jié)束后,才執(zhí)行returndefer fmt.Println("word")fmt.Println("hello")//5.標(biāo)簽goto L1L1:for i:=0;i<5 ;i++ {fmt.Println("輸出內(nèi)容")} }注,range的返回值的輸出:
| sting | index | str[index],返回的類(lèi)型rune |
| array/slice | index | str[index] |
| map | key | m[key] |
| channel | element |
6.函數(shù)
package mainimport ("fmt""time" )//定義一個(gè)函數(shù),參數(shù)類(lèi)型,以及返回值類(lèi)型 func add(a int,b int)int{return a+b }//返回值變量預(yù)定義 func Max(a int,b int)(maxNum int) {if a>b{maxNum=a}else{maxNum=b}return maxNum }//2.函數(shù)基礎(chǔ) //多返回值 func SumResult_A_B( a int,b int)(int,int) {return a,b } //函數(shù)作為參數(shù) type FormatFunc func(s string,x,y int )string //定義函數(shù)類(lèi)型 func pipe(ff func() int )int {return ff() } func format(ff FormatFunc,s string,x,y int )string {//定義返回的是ff函數(shù)的是三個(gè)值return ff(s,x,y) }//定義一個(gè)是否整除2的函數(shù) func isEven(v int)bool{if v%2==0{return true}else {return false} }type boolFunc func(int) bool //聲明一個(gè)函數(shù)類(lèi)型 int是函數(shù)的參數(shù)值,即isEven(v int)中的參數(shù)值,bool為返回值類(lèi)型func filter(slice []int,f boolFunc)[] int{var result [] intfor _,value:=range slice{if f(value){ //這里f調(diào)用函數(shù),根據(jù)傳參判斷,即,在本例子中即是isEvenresult=append(result,value)}}return result }//3.可變參數(shù) 不同數(shù)據(jù)類(lèi)型 func int_change(args ...int){for _,i:=range args {fmt.Printf("數(shù)是%d\n",i)} }//閉包 func Adds()func(b int) int {return func(b int) int {return b+2} } func recursion(parse int){if parse>1{parse--recursion(parse)fmt.Println("當(dāng)前獲得的遞歸數(shù)值為",parse)} } //panic的函數(shù)使用 panic終止后面的執(zhí)行的代碼 func fullName(firstName *string, lastName *string) {if firstName == nil {panic("runtime error: first name cannot be nil")}if lastName == nil {panic("runtime error: last name cannot be nil")}fmt.Printf("%s %s\n", *firstName, *lastName)fmt.Println("returned normally from fullName") }//recover捕獲panic,從而影響應(yīng)用的行為。獲取通過(guò)panic傳遞的error func genErr(){fmt.Println(time.Now(),"正常的語(yǔ)句") //輸出正常的語(yǔ)句//定義延時(shí)函數(shù)defer func(){fmt.Println(time.Now(),"defer正常的語(yǔ)句")panic("第二個(gè)錯(cuò)誤") //只會(huì)輸出第二個(gè)panic的}()panic("第一個(gè)錯(cuò)誤") //第一個(gè)雖然早已經(jīng)發(fā)生,但是不輸出的 } func throwsPanic(f func())(b bool){defer func(){if r:=recover();r!=nil{fmt.Println(time.Now(),"捕獲到的異常:",r)b=true}}()f() //即調(diào)用了genErr,無(wú)panic,即判斷if條件不會(huì)成立的return b }func main() {//1.測(cè)試小例子result_num:=add(1,2)fmt.Println(result_num)result_max_num:=Max(1,3)fmt.Println(result_max_num)//函數(shù)做參數(shù)的函數(shù)調(diào)用s1:=pipe(func() int {return 100 //匿名函數(shù)當(dāng)參數(shù)}) //注意這個(gè)怎么調(diào)用的偶fmt.Println(s1)s2:=format(func(s string, x, y int) string {return fmt.Sprintf(s,x,y) //格式化輸出返回},"值1為%d,值2位%d",10,20)fmt.Println(s2)slice :=[]int{3,3,4,5,6}//函數(shù)作為類(lèi)型even:=filter(slice,isEven)fmt.Println("even:",even)//調(diào)用可變參數(shù)的函數(shù)int_change(1,2,3,4,5,6)//5.匿名函數(shù)與閉包return_x:=func(x1,x2 int) int{return x1+x2}(3,4)fmt.Println(return_x)//閉包。閉包允許調(diào)用定義在其他環(huán)境下的變量,使得某個(gè)函數(shù)捕捉一些外部狀態(tài)。//調(diào)用閉包adds_return:=Adds()(3)fmt.Println(adds_return)//6、遞歸函數(shù)recursion(5)//7錯(cuò)誤與恢復(fù)//error的常見(jiàn)處理f, err := os.Open("/test.txt")if err != nil {fmt.Println("error:",err)return}fmt.Println(f.Name(), "open successfully")*///異常處理//需要注意的是,你應(yīng)該盡可能地使用錯(cuò)誤,而不是使用 panic 和 recover。只有當(dāng)程序不能繼續(xù)運(yùn)行的時(shí)候,才應(yīng)該使用 panic 和 recover 機(jī)制。firstName := "foo"lastName:="zhang"fullName(&firstName, &lastName)fmt.Println("returned normally from main")//recover函數(shù)throwsPanic(genErr)}內(nèi)置函數(shù)
內(nèi)置函數(shù)就是不需要進(jìn)行導(dǎo)入操作就可以直接使用的函數(shù),它們有些可以根據(jù)不包進(jìn)行操作(例如len、cap和append),有些用于系統(tǒng)級(jí)的操作(例如panic)。常見(jiàn)內(nèi)置函數(shù)如下所示。
| close | 用于管道通信。 |
| len | 用于返回某個(gè)類(lèi)型的長(zhǎng)度或數(shù)量(字符串、數(shù)組、切片、map和管道)。 |
| cap | 容量的意思,用于返回某個(gè)類(lèi)型的最大容量(只能用于切片和map)。 |
| new、make | 均用于分配內(nèi)存,不過(guò)new用于值類(lèi)型和用戶(hù)定義的類(lèi)型,如自定義結(jié)構(gòu),make 用于內(nèi)置引用類(lèi)型(切片、map和管道)。它們的用法就像是函數(shù)。但是將類(lèi)型作為參數(shù): new(type)、 make(type)。 new(T)分配類(lèi)型 T的零值并返回其地址,也就是指向類(lèi)型T的指針,它也可以用于基本類(lèi)型: v := new(int)。返回類(lèi)型T的初始化之后的值,因此它比new做更多的工作。new()是一 個(gè)不要忘記它的括號(hào)。 |
| copy、 append | 用于復(fù)制和連接切片。 |
| panic、recover | 兩者均用于錯(cuò)誤處理機(jī)制。 |
| print、println | 底層打印函數(shù)(部署環(huán)境中建議使用fmt包) . |
| complex、 real imag | 用于創(chuàng)建和操作復(fù)數(shù)。 |
7.復(fù)合數(shù)據(jù)類(lèi)型
package mainimport "fmt"func main() { /* 1、數(shù)組的創(chuàng)建以及常見(jiàn)使用*///復(fù)合數(shù)據(jù)類(lèi)型arrays:=[5]int{1,2,3,4,5} //固定長(zhǎng)的數(shù)組for _,v:=range arrays { //輸出結(jié)果值fmt.Println(v)}arrays_a1:=[]int{1,2,3,4,5,6} //非固定長(zhǎng)度的數(shù)組for _,v1:=range arrays_a1 {fmt.Print(v1)}//訪(fǎng)問(wèn)與修改fmt.Println("\n")array_str1:=[5]string{"a","b","c","d","e"}for i:=0;i<len(array_str1) ;i++ {fmt.Printf("值的下標(biāo)為:%d,值是%s\n",i,string(array_str1[i]))}//修改元素array_str2:=[5]string{"a","b","c","d","e"}array_str2[0]="a1"fmt.Println("值為",array_str2[0])//聲明與修改指針的數(shù)組array_str3:=[5]*int{0:new(int),1:new(int)} //聲明指針數(shù)組。初始化索引為0和1的數(shù)組元素*array_str3[0]=10*array_str3[1]=20fmt.Println("數(shù)組的值為:",*array_str3[0])array_str4:=[3]*string{new(string),new(string),new(string)} //字符串的指針的初始化這個(gè)數(shù)組*array_str4[0]="a1"fmt.Println(*array_str4[0])//多維數(shù)組//二維數(shù)組array_str1_a:=[4][2]int{{10,10},{20,21},{30,31},{40,41}}for i:=0;i<len(array_str1_a);i++ {for j:=0;j<len(array_str1_a[i]);j++ {fmt.Printf("每個(gè)的二維數(shù)組的值是%d\n",array_str1_a[i][j])}}//修改array_str1_aarray_str1_a[0][0]=100fmt.Println(array_str1_a)//數(shù)組傳遞給函數(shù),最好聲明為數(shù)組指針,這樣在數(shù)組作為參數(shù)的時(shí)候會(huì)節(jié)省很大的開(kāi)銷(xiāo)。 /* 2.切片操作*///創(chuàng)建切片。make切片量//slice:=make([]string,5) //切片長(zhǎng)度為5,容量也是5//slice:=make([]string,3,5) //切片長(zhǎng)度為3,容量是5。通過(guò)后期操作合并到切片中。注意容量不能小于長(zhǎng)度//nil切片,又稱(chēng)空切片。不做任何初始化,就會(huì)創(chuàng)建一個(gè)nil切片//sclice:=make([]int,0)//sclice:=[]int{}/* 3.切片的使用*///賦值與分割slice_array:=[]int{10,20,30,40,50}//創(chuàng)意長(zhǎng)度為2個(gè)元素,容量為4個(gè)元素new_slice:=slice_array[1:3]for _,v:=range new_slice {fmt.Println(v)}fmt.Println(len(new_slice))//切片擴(kuò)容new_slice=append(new_slice,60)fmt.Println(new_slice)//多維度切片array_str1_b:=[][]int{{10,10},{20,21},{30,31},{40,41},{410,123,111}}array_c1:=[]int{12,123}//切片追加切片slice_array=append(slice_array, array_c1...)fmt.Println(slice_array)//追加多維array_str1_b=append(array_str1_b,array_c1)fmt.Println(array_str1_b)//映射,即字典dict:=map[string]string{"a":"1","b":"2","c":"3"}//修改鍵的值dict["a"]="123"//刪除delete(dict,"c")//追加映射dict["d"]="4"for k,v:=range dict {fmt.Println(k,v)}//數(shù)組中添加mapGoods := []map[string]string{{"a":"1"},{"1":"23"}}fmt.Println(Goods)//map中添加數(shù)組(映射中添加數(shù)組)Goods_p:=map[string][]string{"a":{"1","2","3"},"b":{"4","5","6"}}fmt.Println(Goods_p)//挑戰(zhàn),map中添加數(shù)組,數(shù)組中添加mapGoods_p_dic:=map[string][]map[string]string{"map":{{"a":"1"},{"b":"2"}}}fmt.Println(Goods_p_dic)}總結(jié)
以上是生活随笔為你收集整理的golang学习之旅的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 迅为iTOP-4418/6818开发板-
- 下一篇: 【安卓软件】KMPlayer-一款完美的