Go学习:使用内嵌来扩展已有类型

编程入门 行业动态 更新时间:2024-10-11 07:35:52

Go学习:使用内嵌来扩展<a href=https://www.elefans.com/category/jswz/34/1764632.html style=已有类型"/>

Go学习:使用内嵌来扩展已有类型

如何扩充已有类型?

  • 定义别名:最简单,但是由于以后的维护可能会改成使用组合,别名到组合不能无缝转换;需要改很多代码
  • 使用组合:最常用
  • 使用内嵌:需要省下很多代码;但是可读性较差

定义别名&使用组合

=1001.2014.3001.5502

使用内嵌

node

package treeimport "fmt"type Node struct {Value       intLeft, Right *Node
}func CreateNode(value int) *Node {return &Node{Value: value}
}func (node *Node) Print() {fmt.Print(node.Value, " ")
}func (node *Node) SetValue(value int) {if node == nil {fmt.Println("node is nil")return}node.Value = value
}

traversesal

package treefunc (node *Node) Traverse() {if node == nil {return}node.Left.Traverse()node.Print()node.Right.Traverse()
}

entry

package mainimport ("awesomeProject/tree""fmt"
)type myNode struct {*tree.Node
}func (node *myNode) postOrder() {if node == nil || node.Node == nil {return}left := myNode{node.Left}left.postOrder()right := myNode{node.Right}right.postOrder()node.Print()
}func (node *myNode)Traverse(){fmt.Println("Go to Shadowed Methods")
}func main() {root := myNode{ &tree.Node{Value: 3}}root.Left = &tree.Node{}root.Right = &tree.Node{Value: 5}root.Right.Left = new(tree.Node)root.Left.Right = tree.CreateNode(2)root.Right.Left.SetValue(4)// Go to Shadowed Methodsroot.Traverse()// 0 2 3 4 5root.Node.Traverse()fmt.Println()// 2 0 4 5 3myRoot := myNode{ root.Node}myRoot.postOrder()// cannot use &root (type *myNode) as type tree.Node in assignmentvar baseRoot tree.NodebaseRoot = &root
}
  • 内嵌的话就是把tree.Node的属性名给删掉了;但其实还有一个默认的属性名,就是这个struct的名字:Node
  • myNode 里面内嵌了一个tree.Node;这样的话myNode就可以使用tree.Node的所有成员变量与方法,同样的还可以使用自己的其他成员变量与方法
  • myNode可以对tree.Node的方法进行重载;不过go不叫Override,叫Shadowed;myNode调用方法时,会先检查一下自己有没有这个方法,如果有就用自己的,如果没有就用tree.Node
  • 内嵌看起来有点像继承,但是它与继承时完全不同的两个概念,继承的话可以父类引用指向子类对象;但是go语言却不支持;对编译器来说是没有审核联系的.内嵌的本质其实就是组合的语法糖

更多推荐

Go学习:使用内嵌来扩展已有类型

本文发布于:2023-07-28 19:27:14,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1287128.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:已有   内嵌   类型

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!