go 语言学习(8)--结构体与方法
2019-02-21 17:42
141 查看
文章目录
面向对象
go
只支持封装,不支持继承和多态
go是面向接口的编程,也可以说
go所有对象都是继承了一个空接口
java这类面向对象的语言,三大特点
封装,
继承,
多态,
多态非常重要,可以说前面两个特点都是为了
多态,所以学习
go也会帮助你换个思路理解
面向对象
go暂时没有
泛型,不过2据说要出泛型
我们都知道
c语言是典型的面向过程的,但是
c有结构体这种结构,其实这就是后面的面向对象的基础
结构体定义
来定义一个树型结构
type treeNode struct { value int left, right *treeNode } var root treeNode fmt.Println(root) // {0 <nil> <nil>}
// 结构的创建 root = treeNode{value: 3} root.left = &treeNode{} root.right = &treeNode{5, nil, nil} root.right.left = new(treeNode) fmt.Println(root) root2 := []treeNode{ {value: 3}, {}, {6, nil, root.left}, } root.left.right = createNode(2) fmt.Println(root2) // 没有构造函数,但是可以自定义工厂函数 func createNode(value int) *treeNode { // go 里不需要关心变量是在堆上创建还是栈上创建的 return &treeNode{value: value} }
一定是要传一个地址出去
面向接口编程
假如我想扩展一下这个结构体,想给他增加一个 print 方法
// 函数名前面代表是这个结构体有的方法 // go 是面向接口编程,这其实相当于是实现接口 // treeNode 这个结构体有 print 这个方法 func (node treeNode) print() { fmt.Println(node.value) } root.print()
我这么定义就相当于给 treeNode 这个结构体实现了 print 这个接口
然后就像面向对象那样,点出来就可以有 print 这个方法了
我想改变 treeNode 的 value 值呢
func (node treeNode) setValue(value int) { node.value = value }
这样有问题吗,这样肯定是改变不了 treeNode 的 value 值的,go
里只有值传递,如果想改变这个对象,就要传指针
所以应该改为
func (node *treeNode) setValue(value int) { node.value = value }
一个
*的差别
root.print() root.setValue(100) // 这里两种定义都行,go 的编译器非常聪明 proot := root // proot := &root proot.print() proot.setValue(200) proot.print() // 3 // 100 // 200
遍历二叉树
// root 100->0->2 right 100->5->0 fmt.Println("traverse~") root.traverse() func (node *treeNode) traverse() { if node == nil { return } // 其他语言需要判断 null,go 不用 node.left.traverse() node.print() node.right.traverse() }
非常简洁
总结
- 要改变内容必须使用指针接收者(传递对象的地址)
- 结构过大也考虑指针接收者(指针只是对象的地址)
- 一致性:如果有指针接收者,最好都是指针接受者
相关文章推荐
- Go语言学习七:结构体
- Go语言学习笔记十: 结构体
- Go语言学习笔记(五)方法
- Go语言中通过结构体匿名字段实现方法的继承和重载
- Go语言学习笔记十: 结构体
- Go语言基础(十三)结构体和方法
- [Go语言]从Docker源码学习Go——init()方法和identifier首字母大小写区分
- Golang(Go 语言)入门学习-7-方法
- Go语言指针访问结构体的方法
- Go语言结构体定义和使用方法
- GO语言基础学习------方法_1
- Go语言学习笔记(六)-方法和接口
- Go语言中结构体方法副本传参与指针传参的区别介绍
- Go语言 6 结构体、方法和接口
- Go语言中面向对象-结构体和方法
- go语言学习-数组切片的创建和使用方法
- GO语言学习-方法和接口
- GO语言结构体方法跟结构体指针方法的区别
- go语言学习记录10
- 学习go语言编程中 revel 框架的一个好例子