Go语言基础(十三)结构体和方法
2018-12-05 15:28
465 查看
go语言仅支持封装,不支持继承和多态。
go语言没有class,只有struct。
定义struct
struct声明:
[code]type 标识符 struct { field1 type field2 type }
示例:
[code]type treeNode struct { value int left,right *treeNode } func main() { var root treeNode fmt.Println(root) }
运行结果如下:
初始化默认值value是0,left和rigth都是nil
结构的创建
[code]type treeNode struct { value int left,right *treeNode } func main() { var root treeNode root = treeNode{value:3} root.left = &treeNode{} root.right = &treeNode{6,nil,nil} root.right.left = new(treeNode) nodes := []treeNode{ {value:8}, {}, {6,nil,&root}, } fmt.Println(nodes) }
运行结果如下:
不论地址还是结构本身,一律使用.来访问成员
工厂函数
go语言没有构造函数,但是有时我们又想要使用构造函数咋办,我们可以使用工厂函数,工厂函数就是一些普通的函数,工厂函数返回一个指针
示例:
[code]func createNode(value int) *treeNode { return &treeNode{value:value} }
此时,在函数createNode函数中,treeNode{value: value}是一个局部变量,然后返回的是一个局部变量的地址。
使用工厂函数创建一个节点
[code]package main type treeNode struct { value int left,right *treeNode } func createNode(value int) *treeNode { return &treeNode{value:value} } func main() { var root treeNode root = treeNode{value:3} root.left = &treeNode{} root.right = &treeNode{5,nil,nil} root.right.left = new(treeNode) root.left.right = createNode(2) }
最后一行代码root.left.right = createNode(2),注意:
- 使用了自定义工厂函数
- 返回了局部变量的地址
结构是创建在堆上还是栈上?
不需要知道,它反正后面有垃圾回收器,这个由go语言的编译器和运行环境决定的。
比如说treeNode局部变量没有取地址并返回出去,编译器很可能认为这个变量不需要给外部使用,就在栈上分配。如果treeNode取了地址并返回出去给别人使用,此时treeNode会分配到堆上,堆上分配完了之后这个treeNode就会参与垃圾回收,外面拿着这个指针的人就会做事情,等他做完了,把这个指针扔掉不用了,他就会被回收掉。
我们最后创建的树结构;
为结构定义方法
GO的方法是下定义在一个接收者上的一个函数,接收者是某种类型的变量;
GO的方法其实就是一个变种的函数
[code]func (接收者) 函数名... 正常的函数结构
结合上面的结构,我们来定义方法,其实就是一个最基本的面向对象的雏形
[code]func (node treeNode) print(){ fmt.Print(node.value) }
值接收者VS指针接收者
- 要改变内容必须使用指针接收者
- 结构过大也考虑使用指针接收者
- 一致性:如果有指针接收者,最好都是指针接收者
相关文章推荐
- Go语言指针访问结构体的方法
- 【链块技术28期】区块链基础语言(二十)——Go语言结构体
- C#语言学习--基础部分(十三)枚举类型和结构体
- GO语言基础学习------方法_1
- Go语言中面向对象-结构体和方法
- Go语言中通过结构体匿名字段实现方法的继承和重载
- Go语言基础:make,new, len, cap, append, delete方法
- GO语言结构体方法跟结构体指针方法的区别
- Go语言基础:make,new, len, cap, append, delete方法
- Go基础之--结构体和方法
- Go语言中结构体方法副本传参与指针传参的区别介绍
- Go语言 6 结构体、方法和接口
- Go语言结构体定义和使用方法
- Go语言基础:make,new, len, cap, append, delete方法
- Go语言基础语法学习笔记[3]
- 更灵活的定位内存地址的方法02 - 零基础入门学习汇编语言33
- ObjectC语言基础2—Foundation、结构体、字符串、集合
- Go语言基础学习一:对go的感性初步认识
- C语言基础学习——第9天(结构体、联合、枚举)
- Go语言基础学习三-简单的代码分析(并发)