Monkey

个人站

The master has failed more times than the beginner has tried


GO 语言的面向`对象`-- 结构体和方法

  • GO 语言中仅支持封装,不支持继承和多态。
  • 面向接口编程
  • GO语言没有class,只有struct

  • 不论是本身还是引用,都是用 . 来访问成员的

      package main
    
      import "fmt"
        
      type treeNode struct {
      	value int
      	Left, Right *treeNode
      }
        
      func main() {
      	//root := treeNode{value:3, Left:&treeNode{}, Right:&treeNode{5, nil, nil}}
      	var root treeNode
      	root = treeNode{value:100}
      	root.Left = &treeNode{}
      	root.Right = &treeNode{5, nil, nil}
      	root.Right.Left = new(treeNode)
    
      	nodes := []treeNode {
      		{value:30},
      		{},
      		{6, nil, &root},
      	}
        
      	fmt.Println(nodes)
      	fmt.Println(root)
      }
    
    
  • 构造函数的实现,使用自定义工厂函数

      /**
      工厂函数
       */
      func createNode(value int) *treeNode  {
      	return &treeNode{value:value}
      }
    
  • 注意返回了局部变量的地址。
  • 结构体的方法是值传递,如果传递的是引用,编译器会把地址中的值取出来然后进行传递;如果传递引用,参数需要声明 *

      package main
    
      import (
      	"fmt"
      )
        
      /**
      	声明结构体
       */
      type treeNode struct {
      	value int
      	Left, Right *treeNode
      }
        
      /**
      工厂函数
       */
      func createNode(value int) *treeNode  {
      	return &treeNode{value:value}
      }
        
      /**
      treeNode 方法
       */
      func (node treeNode) print()  {
      	fmt.Println(node.value)
      }
      /**
      	修改node 的值,值传递
       */
      func (node treeNode) setValue(value int)  {
      	node.value = value
      }
      /**
      	修改 node 的值,引用传递
       */
      func (node *treeNode) setValue2(value int)  {
      	node.value = value
      }
        
      func main() {
      	var root treeNode
      	root = treeNode{value:100}
      	root.Left = &treeNode{}
      	root.Right = &treeNode{5, nil, nil}
      	root.Right.Left = new(treeNode)
      	root.Left.Right = createNode(2)
        
      	root.Right.Left.setValue2(30) // 引用传递,值会改变
      	root.Right.Left.print()
      	root.Left.setValue(50)
      	root.Left.print() // 0 值不会改变
        	
      	//root.print()
      	//fmt.Println(root)
      }
    
    • 结构体的方法,显示定义和命名方法接收者;
    • 同样方法可以使用指针作为方法接收者
          func (node *treeNode) setValue(value int) {
              node.value = value
          }
    
    • 只有使用指针才可以改变结构的内容;
    • nil 指针也可以调用方法
    • 树的遍历
      /**
         树的遍历,中树遍历
      */
      func (node *treeNode) traverse()  {
      	if node == nil {
      		return
      	}
      	node.Left.traverse()
      	node.print()
      	node.Right.traverse()
        
      }
      /**
      0
      2
      100
      4
      5
       */
    
  • 值接收者 VS 指针接收者
    • 要改变内容必须使用指针接收者
    • 结构过大也考虑使用指针接收者
    • 【建议】一致性:如果指着接收者,最好都是指针接收者
    • 值接收者是go语言特有
    • 值/指针接收者均可接受值/指针

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦