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、注意:不管是指针还是实例,调用属性或成员变量时,直接使用 点语法(.),没有箭头语法

phper 的Goland学习之路--- 面向对象

7、结构体切片:

            n  :=  [ ] 结构体名 { {v1,v2},{},{}}

                 phper 的Goland学习之路--- 面向对象

8、结构体数组:

         arr [3]Node = { {}, {} ,{}}

9、结构体map:

        map[key]Node

10、返回局部变量的内存地址:

        在go语言中,返回局部变量的内存地址,供外界使用,不会报错;因为go的编译器会判断当前局部变量是否被外界使用,如果使用,则把变量分配在堆内存上,同时,参与go的垃圾回收,等到外界使用完毕以后,该变量将会被回收。

如果不使用,则把该变量分配在栈内存中。

    但是:在c/c++中,局部变量将会被销毁,返回局部变量的内存地址供外界使用,将会报错。因为该局部变量已经被释放掉了,无法通过内存地址来操作该变量。

垃圾回收机制: 回收的是堆内存上的变量,和栈内存无关。栈内存中的变量由系统自动分配和释放。

          phper 的Goland学习之路--- 面向对象

11、为结构体定义方法(成员方法):

   func( 结构体变量 ) 函数名(形参列表)(返回值列表)   {  // 逻辑代码 }

   使用: 结构体变量 / 结构体指针 . 函数名(实参) ;

如: n := Node{ } ;    n . setName("lipei");

在go语言中,所有的传值都是拷贝传值;

结构体调用函数的过程:

(1)当结构体 实例调用函数时,go编译器会把当前实例拷贝一份,传递给func( 实例 )

               phper 的Goland学习之路--- 面向对象

phper 的Goland学习之路--- 面向对象

注意: n和nm是两个不同的结构体变量,拷贝传值后,互不影响,相互独立

(2)使用指针,指向同一个结构体变量:

                    phper 的Goland学习之路--- 面向对象


phper 的Goland学习之路--- 面向对象

              phper 的Goland学习之路--- 面向对象

                phper 的Goland学习之路--- 面向对象

phper 的Goland学习之路--- 面向对象


注意: go编译器对未初始化的变量,会默认初始化。

    指针 - nill   slice-nil    map-nil