日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

go未入门学习记录

發(fā)布時間:2023/11/28 生活经验 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go未入门学习记录 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

go未入門學(xué)習(xí)記錄

開發(fā)環(huán)境配置go1.12.17+goland

參考鏈接macos配置go語言以及goland開發(fā)環(huán)境

語法學(xué)習(xí)記錄

package main
//kaiyu.liu@shopee.com golang學(xué)習(xí)筆記
//參考資料  https://www.kancloud.cn/itfanr/go-quick-learn/81636
//參考視頻  https://www.bilibili.com/video/BV1eK4y1b7fj?p=14
import ("bufio""fmt""math""os""strings"
)//go中函數(shù)構(gòu)造語法  func關(guān)鍵字 + 函數(shù)名 + 參數(shù)列表 + 返回值列表,返回值只有一個類型時括號可以省略
func foo()(string,int){return "1234",900
}//預(yù)先設(shè)置返回值的名字,可以直接return,支持多返回值
func slice_sum(arr []int) (sum int) {sum = 0for _, elem := range arr {sum += elem}return
}//go函數(shù)支持可變長參數(shù),要求:可變長參數(shù)列表里數(shù)據(jù)類型相同以及可變長參數(shù)只能是函數(shù)的最后一個參數(shù)
func sum(base int, arr ...int) int {sum := basefor _, val := range arr {sum += val}return sum
}//閉包函數(shù),類似于函數(shù)指針,將函數(shù)封裝成一個變量,特性在于閉包函數(shù)對其外層的函數(shù)參數(shù)具有修改能力
func example() int{var arr1 = []int{1, 2, 3, 4, 5}var sum = func(arr ...int) int {total_sum := 0for _, val := range arr {total_sum += val}return total_sum}fmt.Println(sum(arr1...))return 0
}//遞歸函數(shù) 就那樣沒啥區(qū)別//go語言中的異常處理
//defer,在函數(shù)運(yùn)行結(jié)束的時候再運(yùn)行語句
func testDefer() {fname := "D:\\Temp\\test.txt"f, err := os.Open(fname)defer f.Close()if err != nil {os.Exit(1)}bReader := bufio.NewReader(f)for {line, ok := bReader.ReadString('\n')if ok != nil {break}fmt.Println(strings.Trim(line, "\r\n"))}
}
//panic&recover異常關(guān)鍵字,panic觸發(fā)異常,cecover終止一場并返回傳遞給panic的值,配合defer一定會運(yùn)行
func test_panic() {defer func() {msg := recover()fmt.Println(msg)}()fmt.Println("I am walking and singing...")panic("It starts to rain cats and dogs")
}func main(){fmt.Println("Hello World!")var name string       //go變量聲明 var 名字 類型var(a string = "111"b int = 111c bool = false)fmt.Println(a,b,c,name)fmt.Printf("%s1234%d\n",a,b)//變量類型推倒 類似autovar y = 200fmt.Println(y)//短變量聲明,只能在函數(shù)內(nèi)部aaa:=123fmt.Println(aaa)//匿名變量aaaa,_:=foo()fmt.Println(aaaa)//常量聲明const pi float32 = 3.1415const(aaaaaa = 1000bbbbbccccc//默認(rèn)與aaaaa一樣)//枚舉  遇到const初始化為0,const中每增加一行都會使我們iota加一,const(a_ = iota //0_ = iota //1c_ = 1000d_ = iota //3)const(_ = iotakb = 1<<(10*iota)mb = 1<<(10*iota))const(a__,b__ = iota+1,iota+2   //1,2c__,d__ = iota+1,iota+2  //2,3)//數(shù)據(jù)類型整型 浮點(diǎn)型 布爾型 字符串 數(shù)組 切片 結(jié)構(gòu)體 函數(shù) map 通道//int8 int16 int32 int64 uint8-16-32-64  uint8=byte int16 = short int64 = long//int 與 uint取決于操作系統(tǒng)為int32或int64//內(nèi)置函數(shù)len()var a1 int = 10fmt.Printf("%d \n",a1)var a2 int = 077 //8進(jìn)制 0開頭fmt.Printf("%o \n",a2)var a3 int = 0xff //16進(jìn)制 0x開頭fmt.Printf("%x \n",a3)//var a4 int = 0b11 //2進(jìn)制 0b開頭//fmt.Printf("%x \n",a4) 1.13開始支持2進(jìn)制fmt.Printf("%p \n",&a1) //%p表示16進(jìn)制內(nèi)存地址//float32 float64兩個常量 math.MaxFloat32 math.MaxFloat64  %f打印fmt.Printf("%f \n",math.MaxFloat32)//go中無法將布爾值與其他類型轉(zhuǎn)換//字符串utf-8編碼// \n換行 \r回車 \t制表 \'單引號 \"雙引號 \反斜杠fmt.Println("\"c:\\go\"")var s = `多行文本不用轉(zhuǎn)義`fmt.Println(s)//字符串操作// 求長度len(s)//拼接字符串 a+bss := fmt.Sprintf("%s%s",s,s)fmt.Println(ss)//分割ret := strings.Split(ss,"行")fmt.Println(ret)//判斷包含 返回布爾retBool := strings.Contains(ss,"行")fmt.Println(retBool)//前綴與后綴ret3 := strings.HasPrefix(ss,"多")ret4 := strings.HasSuffix(ss,"義")fmt.Println(ret3,ret4)//求子串的位置fmt.Println(strings.Index(ss,"行"))fmt.Println(strings.LastIndex(ss,"行"))//joinsss := []string{"11","22","33"}fmt.Println(strings.Join(sss,"-"))//byte與rune類型  分別表示單個的英文與中文,類似于chara_rune := '中'fmt.Println(a_rune)//輸出編碼b_rune := "as中"fmt.Println(len(b_rune)) //輸出5 utf-8下一個中文占3字節(jié)for i:=0;i<len(b_rune);i++{fmt.Printf("%c\n",b_rune[i]) //中文會亂碼}//for range循環(huán) 按照runefor _,v:=range b_rune{fmt.Sprintf("%c\n",v) //range循環(huán)返回兩個,是索引+值}//字符串不能直接改變,轉(zhuǎn)換為byte/rune在轉(zhuǎn)換s1 := "big"s2 := []byte(s1)s2[0] = 'p'fmt.Println(string(s2))//流程控制 if else   for switch goto 沒有while循環(huán)if  3>2{fmt.Println("123")}else {fmt.Println("sas")}if age2:=100;age2>90 { //age2作用域僅在for循環(huán)內(nèi)部fmt.Println("21")}age := 19for age>10{ //類似于while循環(huán)age--}for{//死循環(huán)if age>0 {break}}switch age{//只能寫一個defaultcase 1 :fmt.Println("11")case 2 :fmt.Println("123")default:fmt.Println("asdas")}switch n:=7; n {case 1,3,5,7,9:fmt.Println("jishu")fallthrough //下穿,無條件地執(zhí)行下一條case,case 2,4,6,8:fmt.Println("oushu")}//goto 跳出整個循環(huán)for i:=1;i<3;i++{for j:=1;j<3;j++ {if (i == 2 && j == 2) {goto label}}}label://運(yùn)算符 +-*/  %求余 ++ 自增--自減//數(shù)組var xarray = [5]int{}var xarray1 = [5]int{1,2,3,4,5}var xarray2 = [5]int{}var xarray3 = [...]string{"11","22","33",}//多維數(shù)組 不賦值默認(rèn)初始化為0var xyarray = [3][2]int{[2]int{1,2},[2]int{3,4},[2]int{5,6},}fmt.Println(xarray,xarray1,xarray2,xarray3,xyarray)//切片,切片長度可變,包括長度len()與容量cap()兩個屬性。一種聲明+make,取數(shù)組切片var xsharp = make([]int,5) //cap5 len5var xsharp1 = make([]int,5,10) //cap10 len5fmt.Println(cap(xsharp),cap(xsharp1))//數(shù)組切片賦值var s_1 = xarray1[:3] //類似于py 包含下界不含上界fmt.Println(s_1)//append 函數(shù)可以將切片與某些元素組合,當(dāng)數(shù)量超過容量,cap會變?yōu)?倍slice1 := []int{1,2,3,4,5,6}slice2 := make([]int,5,10)copy(slice2,slice1)  //將slice1賦值給slice2,但由于slice2長度為5,所以結(jié)果為【1,2,3,4,5】//字典var x_map = map[string]string{"a":"apple","b":"banana","o":"orange",}//另一種定義以及初始化方式var x_map2 map[string]stringx_map2 = make(map[string]string)x_map2["a"] = "apple"x_map2["b"] = "banana"//x_map3 := make(map[string]string)for key,val := range x_map{fmt.Println(key,val)}fmt.Println(x_map["p"]) //會返回0,不存在的key值//判斷map中是否存在某個值,返回val為鍵值,ok為key值是否存在的布爾值變量if val,ok := x_map["a"];ok{fmt.Println(val)}//map中刪除元素 delete  刪除不存在的key值時不會報錯delete(x_map,"a")//指針,通過傳指針改變主函數(shù)中的參數(shù)值var x_ptr *intx_val := 10x_ptr = &x_valfmt.Println(x_val)fmt.Println(x_ptr)fmt.Println(*x_ptr)//go中的new函數(shù)x_ptr_new := new(int) //申請了一個存儲整形變量的內(nèi)存,并將此地址賦值給了x_ptr_new*x_ptr_new = 10}//定義一個結(jié)構(gòu)體
type Rect struct {width float64length float64//width, length float64}//結(jié)構(gòu)體的方法不需要定義在結(jié)構(gòu)體內(nèi)部,通過fun后標(biāo)識所屬結(jié)構(gòu)體
func (rect Rect) area() float64 {return rect.width * rect.length
}
//調(diào)用 rect.area()/*使用方法var rect Rectrect.width = 100rect.length = 200//或者按照定于順序賦值var rect = Rect{100, 200}
*///結(jié)構(gòu)體類型指針
func structptr() {var rect = new(Rect)rect.width = 100rect.length = 200fmt.Println("Width:", rect.width, "Length:", rect.length,"Area:", rect.area())
}func (rect *Rect) double_area() float64 {rect.width *= 2rect.length *= 2return rect.width * rect.length
}//使用指針改變結(jié)構(gòu)體的值。此處不改變值加不加*都可,不太嚴(yán)格。。
func ptrana() {var rect = new(Rect)rect.width = 100rect.length = 200fmt.Println(*rect)fmt.Println("Double Width:", rect.width, "Double Length:", rect.length,"Double Area:", rect.double_area())fmt.Println(*rect)
}//結(jié)構(gòu)體內(nèi)嵌直接調(diào)用,類似于繼承
type Phone struct {price intcolor string
}func (phone Phone) ringing() {fmt.Println("ringing")
}type IPhone struct {Phonemodel string
}func inner() {var p IPhonep.price = 5000p.color = "Black"p.model = "iPhone 5"p.ringing() //方法的繼承與調(diào)用fmt.Println("I have a iPhone:")fmt.Println("Price:", p.price)fmt.Println("Color:", p.color)fmt.Println("Model:", p.model)
}//結(jié)構(gòu)體內(nèi)嵌間接調(diào)用,這種類似于把結(jié)構(gòu)體的一個對象當(dāng)作成員
type Phonep struct{price intcolor string
}type Myphone struct{phone Phonepmodel string
}func inner2() {var p Myphonep.phone.price = 5000p.phone.color = "Black"p.model = "iPhone 5"fmt.Println("I have a iPhone:")fmt.Println("Price:", p.phone.price)fmt.Println("Color:", p.phone.color)fmt.Println("Model:", p.model)
}//關(guān)鍵字interface 提供接口功能,其他類型只要實現(xiàn)這個方法就是實現(xiàn)了這個接口,不一定非要顯式地聲明。
//這難道是面向切面編程?跟java有點(diǎn)相似
type ppPhone interface {call()
}type NokiaPhone struct {
}func (nokiaPhone NokiaPhone) call() {fmt.Println("I am Nokia, I can call you!")
}type iiIPhone struct {
}func (iPhone iiIPhone) call() {fmt.Println("I am iPhone, I can call you!")
}
func testInterface() {var phone ppPhonephone = new(NokiaPhone)phone.call()phone = new(iiIPhone)phone.call()
}

總結(jié)

以上是生活随笔為你收集整理的go未入门学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。