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()
}