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()
}
posted @ 2022-06-15 22:12  南风丶轻语  阅读(612)  评论(0编辑  收藏  举报