僅供學習筆記,若有侵權,請聯繫做者刪除面試
(1-1)、只有相同的類型的結構體才能夠比較(1 結構體的屬性類型, 2 屬性的順序) (1-2)、即便兩個結構體的屬性類型和順序相同,可是裏面存在不可比較類型,依然是不能夠直接==比較的。 好比 map,slice 能夠參考用reflflect.DeepEqual方法來進行比較
2-一、nil空值的賦值 空值, 空指針,全部Golang中的引用類型均可以用nil進行賦值 引用類型: interface , function, pointer, map, slice, channel. 2-二、string: 若是表示一個string的空值, 用空字符串來表示 "" 2-三、不可以將nil賦值給一個string類型
(1)數據類型的本質:固定內存大小的別名
(2)數據類型的做用:編譯器預算對象或變量分配內存空間的大小
(3)內存四區:數組
棧區:app
空間較小,要求數據讀寫性能高,數據存放時間較短暫。 由編譯器主動分配和釋放,存放函數的參數值、函數的調用流程方法地址、 局部變量等(局部變量若是產生逃逸現象,可能會掛在在堆區)
堆區:異步
空間充裕,數據存放時間較久。通常由開發者分配及釋放(可是Golang中會根據變量的逃逸現象來選擇是否分配到棧上或堆上),啓動Golang的GC由GC清除機制回動回收。
全局區:函數
靜態全局變量區: 全局變量的開闢是在程序在main以前就已經放在內存中。並且對 外徹底可見。即做⽤域在所有代碼中,任何同包代碼都可隨時使 用,在變量會搞混淆,並且在局部函數中若是同名稱變量使用 := 賦值會出現編譯錯誤。 常量區: (1)常量區也歸屬於全局區,常量爲存放數值字面值單位,即不 可修改。或者說的有的常量是直接掛鉤字面值的。 (2)const cl = 10; cl是字面量10的對等符號。
代碼區:性能
存放代碼邏輯的內存
slice在通過make初始化,默認的數據的值是0,append是動態額外開闢內存。
兩個slice在append的時候,記住須要進行將第2個slice進行...打散再拼接。 如:s1 = append(s1, s2...)
改寫:
學習
一、 make只適於slice、map以及channel的初始化(非零值); make返回的仍是這三個引用類型自己; 而new用於類型的內存分配,而且內存置爲零;而new返回的是指向類型的指針。 二、不建議用new來開闢slice , map 和 channel
定義map 一、不推薦 map[string]Student map的value student的屬性是不能夠修改的 二、推薦 map[string]*Student map的value student的屬性是能夠修改的
方法一:(性能比較差)
方法二:(推薦)
spa
不推薦:遍歷map的時候,不要採用range的方式來遍歷 //將數組依次添加到map中 for _, stu := range stus { m[stu.Name] = &stu } 推薦: //遍歷整個slice數組,依次賦值給map for i := 0; i < len(stus); i++ { m[stus[i].Name] = &stus[i] }
package main import ( "fmt" ) type student struct { Name string Age int } func main() { //定義map m := make(map[string]*student) //定義student數組 stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } //將數組依次添加到map中 for _, stu := range stus { m[stu.Name] = &stu } //打印map for k,v := range m { fmt.Println(k ,"=>", v.Name) } }
錯誤示範:
畫圖分析:
3d
正確寫法:
指針
多態的三要素
一、有interface接口,而且有接口定義的方法。 二、有子類去重寫interface的接口。 三、有父類指針指向⼦類的具體對象
若是People是一個interface類型
var peo People = Stduent{} 錯誤的 var peo People = &Student{} 正確的
上面代碼會輸出什麼?
輸出:BBBBBBB
空接口:
非空接口:
*interface{}自己不是萬能指針, 就是eface結構體的地址。 若是以*interface{}做爲形參,那麼他只可以接收*interface{}類型的實參
給一個 nil channel 發送數據,形成永遠阻塞 從一個 nil channel 接收數據,形成永遠阻塞 給一個已經關閉的 channel 發送數據,引發 panic 從一個已經關閉的 channel 接收數據,若是緩衝區中爲空,則返回一個零值 無緩衝的channel是同步的,而有緩衝的channel是非同步的(異步)