Golang易錯(cuò)知識(shí)點(diǎn)匯總
類型轉(zhuǎn)換和類型斷言
類型轉(zhuǎn)換語法:Type(expression)
類型斷言語法為:expression.(Type)
1.類型轉(zhuǎn)換示例代碼
package main import "fmt" //典型的類型轉(zhuǎn)換示例 func main() { // 類型轉(zhuǎn)換示例 var a int = 5 var b int = 2 var c float32 c = float32(a) / float32(b) //這里就是典型的類型轉(zhuǎn)換 fmt.Printf("a的類型:%T\n", a) fmt.Printf("b的類型:%T\n", b) fmt.Printf("c的類型:%T\n", c) fmt.Printf("c的值:%v\n", c) //如果我們不進(jìn)行類型轉(zhuǎn)換,看下輸出結(jié)果 fmt.Printf("不進(jìn)行類型轉(zhuǎn)換的輸出結(jié)果:%v\n", a/b) //從結(jié)果可以看出值為2,丟失了精度 }
打印結(jié)果
2.類型斷言代碼示例
注意:對(duì)于類型斷言,expression 必須是接口類型
package main import "fmt" //經(jīng)典的類型斷言示例 搭配switch使用 func main() { var x interface{} x = 1 switch x.(type) { //這就是上面說的expression.(Type) case float32: fmt.Println("類型是:float32") case string: fmt.Println("類型是:string") case int: fmt.Println("類型是:int") default: fmt.Println("未知類型") } }
運(yùn)行結(jié)果
全局變量
定義全局變量必須用var,全局變量要定義在函數(shù)之外,而在函數(shù)之外定義的變量只能用var定義。
全局變量使用var,編譯通過
全局變量不使用var,編譯不通過
init函數(shù)
這是官方對(duì)于init()函數(shù)的介紹:
變量除了可以在全局聲明中初始化,也可以在 init ()函數(shù)中初始化。這是一類非常特殊的函數(shù),它不能夠被人為調(diào)用,而是在每個(gè)包完成初始化后自動(dòng)執(zhí)行,并且執(zhí)行優(yōu)先級(jí)比 main 函數(shù)高。 初始化總是以單線程執(zhí)行,并且按照包的依賴關(guān)系順序執(zhí)行。 一個(gè)可能的用途是在開始執(zhí)行程序之前對(duì)數(shù)據(jù)進(jìn)行檢驗(yàn)或修復(fù),以保證程序狀態(tài)的正確性。
如何覺得上面這一大段話不好理解的話,可以看我的總結(jié):
- init函數(shù)可以在任何包中有0個(gè)、1個(gè)或多個(gè);
- main函數(shù)只能在main包中有且只有一個(gè),但是main包中也可以有0個(gè)、1個(gè)或多個(gè)init函數(shù);
- init函數(shù)和main函數(shù)都不能被顯式調(diào)用;
Go語言中變量、init函數(shù)、main函數(shù)的執(zhí)行順序
- 首先初始化導(dǎo)入包的變量和常量
- 然后執(zhí)行導(dǎo)入包的init函數(shù)
- 然后初始化本包的變量和常量
- 然后執(zhí)行本包的init函數(shù)
- 最后執(zhí)行本包的main函數(shù)
Go接口總結(jié)
這是我在刷題的時(shí)候碰到的,總結(jié)出來給大家:
- 如果兩個(gè)接口擁有相同方法列表(順序可以不一致),那么這兩個(gè)接口實(shí)質(zhì)上同一個(gè)接口
- 接口A是接口B的子集,意味著A的方法B中都有,那么A是B的基類,所以A=B是可行的
- 接口是否能夠調(diào)用成功,需要運(yùn)行的時(shí)候才能知道
- 接口賦值是否可行,在編譯階段就可以知道
Go字符串
Go語言中的字符串不支持下標(biāo)操作
在go語言中,字符串是一種基本類型,和其它開發(fā)語言不同,Go的字符串是由單個(gè)字節(jié)連接起來的。
Go語言統(tǒng)一使用utf-8編碼標(biāo)識(shí)Unicode文本。當(dāng)字符為ASCII編碼時(shí),占用1個(gè)字節(jié),其它字符占用2到4個(gè)字節(jié),中文占用3個(gè)字節(jié)
如何修改字符串的內(nèi)容
有三種方法:
- 將字符串轉(zhuǎn)成byte切片,再根據(jù)下標(biāo)替換內(nèi)容
- 將字符串轉(zhuǎn)為rune切片,再根據(jù)下標(biāo)替換內(nèi)容
- 使用原生包
strings
中的Replace()
方法
示例代碼
package main import ( "fmt" "strings" ) func main() { //第一種方法 將字符串轉(zhuǎn)成byte切片 s := "hello" s2 := []byte(s) s2[0] = 'x' fmt.Printf("轉(zhuǎn)成byte切片:%v\n", string(s2)) //打印結(jié)果:轉(zhuǎn)成byte切片:xello // 第二種方法 將字符串轉(zhuǎn)為rune切片 s3 := "王中陽" s4 := []rune(s3) //注意:中文字符串要進(jìn)行修改,只能轉(zhuǎn)成rune切片,不能轉(zhuǎn)成byte切片 s4[0] = '楊' fmt.Printf("轉(zhuǎn)成rune切片:%v\n", string(s4)) //打印結(jié)果:轉(zhuǎn)成rune切片:楊中陽 // 第三種方法,使用原生包strings 中的 Replace() 方法 s5 := "abcdef" old := "abc" newString := "ABC" s6 := strings.Replace(s5, old, newString, -1) //最后一個(gè)參數(shù)n的作用是:返回將s5中前n個(gè)不重疊old子串都替換為new的新字符串,如果n<0會(huì)替換所有old子串。 fmt.Printf("strings替換之后的:%v\n", s6) //打印結(jié)果:strings替換之后的:ABCdef }
運(yùn)行結(jié)果
slice
slice可以通過append方式實(shí)現(xiàn)元素的刪除。
**切片使用冒號(hào)分隔時(shí)遵循"前閉后開"原則,即包括前面的值,不包括后面的值。 **
1.刪除單個(gè)元素
package main import "fmt" //使用append 刪除單個(gè)元素 func main() { var data = []int{0, 1, 2, 3, 4, 5} //刪除元素2 index := 2 //切片使用冒號(hào)分隔時(shí)遵循"前閉后開"原則,即包括前面的值,不包括后面的值。 data1 := append(data[:index], data[index+1:]...) fmt.Println(data1) }
運(yùn)行結(jié)果
2.刪除多個(gè)元素
package main import "fmt" //使用append 刪除多個(gè)元素 func main() { var data = []int{0, 1, 2, 3, 4, 5} //刪除元素0,1,2 index := 2 //切片使用冒號(hào)分隔時(shí)遵循"前閉后開"原則,即包括前面的值,不包括后面的值。 data1 := append(data[:0], data[index+1:]...) fmt.Println(data1) }
運(yùn)行結(jié)果
總結(jié)
這篇文章匯總了我再開發(fā)和刷面試題過程中遇到的容易搞錯(cuò)的知識(shí)點(diǎn),包括:
- 類型轉(zhuǎn)換和類型斷言的對(duì)比
- 定義全局變量只能用var,定義全局變量也可以定義在init()函數(shù)中
- init()函數(shù)的知識(shí)點(diǎn),以及init函數(shù)和main函數(shù)的執(zhí)行順序:先執(zhí)行引用包的常量和變量、在執(zhí)行引用包的init函數(shù)、再執(zhí)行本包的常量和變量、再執(zhí)行本包的init函數(shù)、最后才會(huì)執(zhí)行本包的main函數(shù)。
- Go接口的概念總結(jié),刷面試題的時(shí)候可能碰到咬文嚼字的問題,注意避坑。
- Go字符串不能通過下標(biāo)直接修改內(nèi)容,但是可以通過轉(zhuǎn)成byte[]/rune[]/以及使用原生包strings中的Replace()方法修改內(nèi)容
- Go中的slice不能像map一樣直接使用delete()方法刪除元素,可以使用append()方法+冒號(hào)分隔切片的方式,間接實(shí)現(xiàn)切片元素的刪除。
到此這篇關(guān)于Golang易錯(cuò)知識(shí)點(diǎn)匯總的文章就介紹到這了,更多相關(guān)Golang知識(shí)點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
自動(dòng)生成代碼controller?tool的簡單使用
這篇文章主要為大家介紹了自動(dòng)生成代碼controller?tool的簡單使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05如何使用Golang創(chuàng)建與讀取Excel文件
我最近工作忙于作圖,圖表,需要自己準(zhǔn)備數(shù)據(jù)源,所以經(jīng)常和Excel打交道,下面這篇文章主要給大家介紹了關(guān)于如何使用Golang創(chuàng)建與讀取Excel文件的相關(guān)資料,需要的朋友可以參考下2022-07-07go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)基本操作詳解
這篇文章主要為大家介紹了go?sync?Waitgroup數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)基本操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01