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