您的位置:首页 > 编程语言 > Go语言

Go语言中面向对象-结构体和方法

2018-05-20 16:24 736 查看

主要讲解Go语言中面向对象中的 结构体和方法

主要知识点:

Go语言仅支持封装,不支持继承和多态,Go语言的设计者认为Go语言面向对象不需要继承和多态,只需要封装就够了,而继承和多态通过接口来实现就可以了,面向接口编程在面向对象领域也是一种趋势

Go语言中没有 class、只有 struct,封装就是结构体对结构体进行封装。

Go语言中没有构造方法,在初始化结构体时,提供了多种初始化方式。

如果业务需要可以通过自定义工厂方法,实现构造方法的功能

结构体对象可能在栈上,也可能在堆上,此时我们并不需要知道,当编译器觉得不需要返回地址的时候则在栈上创建,如果需要返回地址,则在堆上创建。

熟悉为结构体定义方法,定义方法是分为 值接受者 和 指针接收者,只有指针接受者 才可以改变内容,如果结构体过大,也建议使用指针接受者

以下为代码示例:

package main

import "fmt"

//实体 结构体 定义
type treeNode struct {
Value       int
Left, Right *treeNode
}

//自定义工厂方法 实现构造函数功能
func createTreeNode(value int) *treeNode {
return &treeNode{Value:value}
//此处返回一个局部变量地址给外部使用,如果在 C++ 中,这是一个错误写法,会导致错误
//但在 Go中 不会出现问题
}

//为结构体定义方法,有一个接收者的概念,这个方法是 值接受者
// 为treeNode 定义方法,node相当于 Java 中的 this
func (node treeNode) print()  {
fmt.Println(node.Value)
}

//定义set 方法,这里是 指针接收者
func (node *treeNode) setValue(value int) {
if node == nil {
fmt.Println("Setting Value to nil " +
"node. Ignored.")
return
}
node.Value = value
}
//遍历对象方法
func (node *treeNode) traverse()  {
if node == nil{
return
}
node.Left.traverse()
node.print()
node.Right.traverse()
}

func main() {
//申明空结构体
var root treeNode
//初始化部分属性
root = treeNode{Value:3}
//初始化空的结构体
root.Left = &treeNode{}
//申明时初始化全部属性
root.Right = &treeNode{5,nil,nil}
// new 是内置方法,返回对象的指针
root.Left.Right = new(treeNode)
root.Right.Left = createTreeNode(2)

//在Slice 中省略 结构体名的写法
nodes :=[]treeNode{
{Value:3},
{},
{6,nil,&root},
}
fmt.Println(nodes)
root.print() //3

root.Right.Left.setValue(4) //4
root.Right.Left.print()

//遍历对象方法
root.traverse()
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Go