Go语言结构体

1、结构体的定义

定义:type xxx struct

使用:var关键字创建、冒号:创建、new关键字创建

例如

package main

import "fmt"

type treeNode struct {
   value       int
   left, right *treeNode
}

func main() {

   var root treeNode         //var关键字创建
   fmt.Print(root)           //{0 <nil> <nil>}
   root = treeNode{value: 3} //直接赋值
   root.left = &treeNode{
      value: 0,
      left:  nil,
      right: nil,
   } //左节点
   root.right = &treeNode{5, nil, nil} //右节点
   root.right.left = new(treeNode)     //右节点的左节点 new关键字创建

   //结构体数组
   nodes := []treeNode{{3, nil, nil}, {}, {6, nil, nil}}
   fmt.Println(nodes)
}

2、结构体的方法

类似定义方法,前面有个接收者,其他就是正常的函数定义,表面该方法是给接收者使用的

如果是赋值,则接收者需要是传递地址,需要用*表示,使用引用传递

即:只有接收者指针才可以改变结构体内容

package main

import "fmt"

type treeNode struct {
	value       int
	left, right *treeNode
}

func (receiver treeNode) getValue() {
	//receiver 是接收者,说明getValue方法是给treeNode结构体使用的
	//就是一个普通函数
	fmt.Println(receiver.value)
}
func (receiver *treeNode) setValue(v int) {
	if receiver == nil {
		return
	}
	receiver.value = v
}

func main() {
	root := treeNode{1, nil, nil}
	root.left = &treeNode{value: 2}
	root.right = &treeNode{
		value: 3,
		left:  nil,
		right: nil,
	}
	n := new(treeNode)
	fmt.Println(n)
	n.setValue(4)
	fmt.Println(n)
	root.getValue()
	root.right.getValue()
}

ps:

遍历树

package main

import (
   "fmt"
)

type treeNode struct {
   value       int
   left, right *treeNode
}

func (receiver treeNode) getValue() {
   //receiver 是接收者,说明getValue方法是给treeNode结构体使用的
   //就是一个普通函数
   fmt.Println(receiver.value)
}
func (receiver *treeNode) setValue(v int) {
   if receiver == nil {
      return
   }
   receiver.value = v
}

func (receiver *treeNode) traverse() {
   //遍历
   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,
   }
   n := new(treeNode)
   fmt.Println(n)
   n.setValue(4)
   fmt.Println(n)
   root.getValue()
   root.right.getValue()

   root.traverse() //遍历
}

3、值接收者和指针接收者

要改变内容,必须使用指针接收者

结构过大也要考虑指针接收者

一致性:如果有指针接收者,最好都是指针接收者(建议,不强制要求)

值接收者是go语言特有的

posted @ 2022-06-15 21:37  南风丶轻语  阅读(26)  评论(0编辑  收藏  举报