1. 程式人生 > >phper 的Goland學習之路--- 面向物件

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