熱烈歡迎你,相識是一種緣分,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的 啊,其實問題的原因很簡單 你...