Go语言扩展结构体方法
一些注意事项:
1.每个目录只有能一个包,可以有多个文件,但是所有文件都必须是同一个包(编辑器会提示的,不用特意关注)
2.包内的大写函数、大写结构体是包外可见,小写函数、小写结构体仅是包内可见
3.为一个结构体定义的方法,必须放在同一个包内,可以是不同的文件
①但是如果想扩展结构体的方法,也就是说别人定义的结构体,你想添加新的方法
-
使用组合,定义一个自己的结构体,里面有个值就是元素的结构体
例如:原来树只有一种遍历方式,我想新增加一种,我是import别人的树,无法在它的包里添加新方法,因此使用组合方式
package main
import "fmt"
type treeNode struct {
value int
left, right *treeNode
}
func (receiver *treeNode) traverse() {
//遍历
if receiver == nil { //如果是nil则不继续遍历左节点,右节点 也不输出value 因为它没有value
return
}
receiver.left.traverse() //遍历自己的左节点
print(receiver.value) //打印自己的值
receiver.right.traverse() //遍历自己的右节点
}
type myTreeNode struct {
node *treeNode
}
func (m *myTreeNode) other() {
if m == nil || m.node == nil {
return
}
m.node.left.traverse() //遍历自己的左节点
m.node.right.traverse() //遍历自己的右节点
print(m.node.value) //打印自己的值
}
func main() {
root := treeNode{1, nil, nil}
root.left = &treeNode{value: 2}
root.right = &treeNode{
value: 3,
left: nil,
right: nil,
}
root.traverse() //遍历
fmt.Println()
m := myTreeNode{&root}
m.other()
}
-
使用别名
package main import "fmt" type treeNode struct { value int left, right *treeNode } func (receiver *treeNode) traverse() { //遍历 if receiver == nil { //如果是nil则不继续遍历左节点,右节点 也不输出value 因为它没有value return } receiver.left.traverse() //遍历自己的左节点 print(receiver.value) //打印自己的值 receiver.right.traverse() //遍历自己的右节点 } type otherName treeNode //取别名 func (receiver *otherName) traverse1() { //新增的方法 //遍历 if receiver == nil { //如果是nil则不继续遍历左节点,右节点 也不输出value 因为它没有value return } receiver.left.traverse() //遍历自己的左节点 print(receiver.value) //打印自己的值 receiver.right.traverse() //遍历自己的右节点 } func main() { root := treeNode{1, nil, nil} root.left = &treeNode{value: 2} root.right = &treeNode{ value: 3, left: nil, right: nil, } root.traverse() //遍历 fmt.Println() var o otherName o = otherName(root) o.traverse1() }
-
使用内嵌
其实就是组合中把字段名删除
package main
type treeNode struct {
value int
left, right *treeNode
}
func (receiver *treeNode) traverse() {
//遍历
if receiver == nil { //如果是nil则不继续遍历左节点,右节点 也不输出value 因为它没有value
return
}
receiver.left.traverse() //遍历自己的左节点
print(receiver.value) //打印自己的值
receiver.right.traverse() //遍历自己的右节点
}
type myTreeNode struct {
*treeNode
}
func (m *myTreeNode) other() {
if m == nil {
return
}
m.left.traverse() //遍历自己的左节点
m.right.traverse() //遍历自己的右节点
print(m.value) //打印自己的值
}
func main() {
root := treeNode{1, nil, nil}
root.left = &treeNode{value: 2}
root.right = &treeNode{
value: 3,
left: nil,
right: nil,
}
m := myTreeNode{&root}
m.other()
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2021-06-15 tkinter之菜单Menu