phper 的Goland學習之路--- 面向物件
1、面向物件:
只支援封裝,不支援繼承和多型。
2、go語言中沒有class,只有struct。
3、宣告一個結構體型別:
type Node struct{ left ,right *Node; //結構體指標 //成員變數} //Node相當於類名/結構體名
4、定義一個結構體變數: var n Node ;
5、建立一個結構體例項:
(1)結構體名{ 成員:值,成員2 : 值2} ; // 結構體變數 類似建構函式 Node { }
var n Node = Node{ age:1 , height:12} ;
n.left = &Node{ }; // var nm *Node = & n ;
(2)結構體名{value1,value2} // 結構體變數
n.right= &Node{nil,nil };
(3)使用new(結構體名)---返回記憶體首地址
n.right.left = new(Node) ; //new 返回 記憶體首地址
(4)定義的同時,初始化:
n := Node{ } ;
6、注意:不管是指標還是例項,呼叫屬性或成員變數時,直接使用 點語法(.),沒有箭頭語法
7、結構體切片:
n := [ ] 結構體名 { {v1,v2},{},{}}
8、結構體陣列:
arr [3]Node = { {}, {} ,{}}
9、結構體map:
map[key]Node
10、返回區域性變數的記憶體地址:
在go語言中,返回區域性變數的記憶體地址,供外界使用,不會報錯;因為go的編譯器會判斷當前區域性變數是否被外界使用,如果使用,則把變數分配在堆記憶體上,同時,參與go的垃圾回收,等到外界使用完畢以後,該變數將會被回收。
如果不使用,則把該變數分配在棧記憶體中。
但是:在c/c++中,區域性變數將會被銷燬,返回區域性變數的記憶體地址供外界使用,將會報錯。因為該區域性變數已經被釋放掉了,無法通過記憶體地址來操作該變數。
垃圾回收機制: 回收的是堆記憶體上的變數,和棧記憶體無關。棧記憶體中的變數由系統自動分配和釋放。
11、為結構體定義方法(成員方法):
func( 結構體變數 ) 函式名(形參列表)(返回值列表) { // 邏輯程式碼 }
使用: 結構體變數 / 結構體指標 . 函式名(實參) ;
如: n := Node{ } ; n . setName("lipei");
在go語言中,所有的傳值都是拷貝傳值;
結構體呼叫函式的過程:
(1)當結構體 例項呼叫函式時,go編譯器會把當前例項拷貝一份,傳遞給func( 例項 )
注意: n和nm是兩個不同的結構體變數,拷貝傳值後,互不影響,相互獨立
(2)使用指標,指向同一個結構體變數:
注意: go編譯器對未初始化的變數,會預設初始化。
指標 - nill slice-nil map-nil