go import 指定分支 Go語言的那些坑二

2021-10-13 17:28:10 字數 4266 閱讀 1170

熱烈歡迎你,相識是一種緣分,echa 哥為了你的到來特意準備了乙份驚喜,go學習資料《「轉」go 語言實戰筆記教程系列大綱彙總-值得收藏》

目錄:go語言的那些坑

golang中函式被看做是值,函式值不可以比較,也不可以作為map的key

請問以下**能編譯通過嗎?

import ("fmt")func main()()] = func()intfmt.println(array)}
答案:

可以正常編譯通過。
稍作改動,改為如下的情況,還能編譯通過嗎?

import ("fmt")func main()] = 10fmt.println(array)}
答案:

不能編譯通過。
在go語言中,函式被看做是第一類值:(first-class values):函式和其他值一樣,可以被賦值,可以傳遞給函式,可以從函式返回。也可以被當做是一種「函式型別」。例如:有函式func square(n int) int ,那麼就可以賦值f := square,而且還可以fmt.println(f(3))(將列印出「9」)。go語言函式有兩點很特別:

請看下列**輸出什麼?

答案:

4444
在上述**中,匿名函式中記錄的是迴圈變數的記憶體位址,而不是迴圈變數某一時刻的值。

想要輸出1、2、3、4需要改為:

其實就加了條elem := e看似多餘,其實不,這樣一來,每次迴圈後每個匿名函式中儲存的就都是當時區域性變數elem的值,這樣的區域性變數定義了4個,每次迴圈生成乙個。

請看一下**,請問輸出true還是false

import (    "fmt"    "reflect")func main()    arrayb := [...]int    fmt.println(reflect.typeof(arraya) == reflect.typeof(arrayb))}
答案是:

false
陣列長度是陣列型別的乙個組成部分,因此[3]int和[4]int是兩種不同的陣列型別。

例如:

func main()     samplemap["test"] = 1    fmt.println(samplemap)}
會輸出:

map[test1:1 test:1]
有點像php陣列的感覺,但是又不一樣:arraya的長度是多少呢?

map[test1:1 test:1]
答案是:

map[test1:1 test:1]
沒錯,定義了乙個陣列長度為4的陣列,指定索引的陣列長度和最後乙個索引的數值相關,例如:r := [...]int就定義了乙個含有100個元素的陣列r,最後乙個元素輸出化為-1,其他的元素都是用0初始化。

map[test1:1 test:1]
map中的元素不是乙個變數,不能對map的元素進行取位址操作,禁止對map進行取位址操作的原因可能是map隨著元素的增加map可能會重新分配記憶體空間,這樣會導致原來的位址無效

map[test1:1 test:1]
輸出報錯:

map[test1:1 test:1]
必須使用make或者將map初始化之後,才可以新增元素。

以上**可以改為:

map[test1:1 test:1]
可以正確輸出:

map[test1:1 test:1]
&dilbert.position相當於&(dilbert.position)而非(&dilbert).position

請看例子:

請問輸出什麼?

func main()    var dilbert employee    dilbert.position = "123"    position := &dilbert.position    fmt.println(position)}
輸出:

0xc42006c220
輸出的是記憶體位址

修改一下,把&dilbert.position改為(&dilbert).position

func main()    var dilbert employee    dilbert.position = "123"    position := &dilbert.position    fmt.println(position)}
輸出:

123
請看下面例子:

type employee struct func employeebyid(id int) employee }func main()
請問能編譯通過嗎?

執行,輸出報錯:cannot assign to employeebyid(1).salary

在本例子中,函式employeebyid(id int)返回的是值型別的,它的取值employeebyid(1).salary也是乙個值型別;值型別是什麼概念?值型別就是和賦值語句var a = 1或var a = hello world等號=右邊的1、hello world是乙個概念,他是不能夠被賦值的,只有變數能夠被賦值。

修改程式如下:

type employee struct func employeebyid(id int) employee }func main()
這就可以編譯通過了

請看下面的例子,請問會編譯通過嗎?

import ("fmt")type littlegirl structtype girl *littlegirlfunc(this girl) changename(name string)func main()girl.changename("yoyo")fmt.println(littlegirl)}
答案:

不能編譯通過,會提示「invalid receiver type girl(girl is a pointer type)」
go語言中規定,只有型別(type)和指向他們的指標(*type)才是可能會出現在接收器宣告裡的兩種接收器,為了避免歧義,明確規定,如果乙個型別名本身就是乙個指標的話,是不允許出現在接收器中的。

請看下面的例子,請問能編譯通過嗎?

import ("fmt")type littlegirl structfunc(this littlegirl) changename(name string)func main()little = nillittle.changename("yoyo")fmt.println(little)}
答案:

不能編譯通過,顯示"cannot use nil as type littlegirl in assignment"
go語言中,允許方法用nil指標作為其接收器,也允許函式將nil指標作為引數。而上述**中的littlegirl不是指標型別,改為*littlegirl,然後變數little賦值為&littlegirl就可以編譯通過了。並且,nil對於物件來說是合法的零值的時候,比如map或者slice,也可以編譯通過並正常執行。

不同於php的date("y-m-d h:i:s", time()),golang的格式化奇葩的很,不能使用諸如y-m-d h:i:s的東西,而是使用2006-01-02 15:04:05這個時間的格式,請記住這個時間,據說這是golang的誕生時間。

time := time.now()time.format("20060102") //相當於ymdtime.format("2006-01-02")//相當於y-m-dtime.format("2006-01-02 15:04:05")//相當於y-m-d h:i:stime.format("2006-01-02 00:00:00")//相當於y-m-d 00:00:00

GO語言 分支

if else if a 0else if a 1else規則和c一樣,只是左大括號不能另起一行。switch switch n相當於c c switch n 可以看出go語言每個case的分支是預設帶break,反而想使用啟用剩下所有的case這個特性必須加入關鍵字 fallthrough 另外g...

GIT 指定分支下建立分支

eg master分支下建立 git checkout master 切換到master分支下 git branch branch tmp a 在本地倉庫建立臨時分支branch tmp a git checkout branch tmp a 切換到分支branch tmp a下 git push ...

git拷貝指定分支到新分支

有時候有這樣一種需求 遠端分支有兩個 當然本地也是這兩個 這個時候產品說,我要在master加個新功能,開始搞,我們都知道要建立乙個新的分支,因為master分支一般是保護分支,不能隨便提交的,這時候會發現問題,為啥我新分支merge了master還是有develop的 啊,其實問題的原因很簡單 你...