感觉每种语言都是其他的语言的一些交集,看见go就有种kotlin和C的孩子的感觉,虽然我并不清楚他们之间的借鉴关系
go语言仅支持封装,不支持继承和多态
go语言只有struct没有class
go语言的结构的定义和C++类似
type treeNode struct { value int left, right *treeNode }
为结构定义方法:
func (node treeNode) print() { //接收者相当于this,这个方法相当于kotlin的扩展方法 fmt.Print(node.value, " ") }
显示定义和命名方法接收者
使用指针作为方法接受者
func (node *treeNode) setValue(value int) { node.value = value }
只有指针才可以改变结构内容
nil指针也可以调用方法!
func (node *treeNode) setValue(value int) { if(node == nil) { fmt.Println("Setting value to nil node, ignore it") } node.value = value }
也就是通过这样的方式可以解决java中最常见的空指针异常的问题,这个问题是一个大问题,所以现在我尽可能使用kotlin开发android应用,java开发过程中的空指针问题真的是一种很麻烦的问题
常见操作(二叉树的中序遍历操作)
//中序遍历操作,基本操作 func (node *treeNode) traverse() { if node == nil { return } node.left.traverse() node.print() node.right.traverse() }
值接收者和指针接收者的使用
1.要改变内容必须使用指针接收者
2.结构过大也考虑指针接收者
3.一致性:如有指针接收者,最好都是指针接收者
4.值接受者是go语言特有的
5.值/指针均可接收值/指针,并不会改变调用的方式,go语言在这方面很智能