Golang结构体

Golang结构的使用

Go中的结构体与C语言的结构体相似,可以包括多种数据类型。但也增加了一些新的特性,便于开发人员的使用。

type Animal struct {
	name string
	age  int
	son *Animal
}

注意:

  1. Go语言中使用首字母的大小写控制访问,结构体中同样如此,小写的变量包外不可导出。
  2. 结构体中可以使用 *Animal 的形式定义一个指针类型来实现链表和树的数据结构,与C语言类似。
  3. 两个struct如果其成员变量相同但顺序不同也视为不同的struct
  4. 若结构体的所有成员变量是可比较的,则该结构体是可比较的。

1、结构体嵌套和匿名成员变量

结构体的嵌套是指将一个结构体作为另一个结构体的成员变量嵌套在其中,复用共同的地方。匿名成员变量则是指不给变量命名,调用时直接调用最上层的成员变量。
e.g.

package main

import (
	"fmt"
)

type animal struct {
	name string
	age  int
}

type cat struct {
	//嵌套的匿名成员变量
	animal
	speed float64
}

type bird struct {
	animal
	weight float64
}

type eagle struct {
	bird
	flyHeight float64
}

func main() {
	//对嵌套成员变量的初始化,必须加上name
	a := cat{animal{"coco", 3}, 30}
	b := eagle{bird{animal{"KK", 4}, 20}, 2000}
	fmt.Println(a)
	fmt.Println(b)
	//‘#’表示
	fmt.Printf("%#v\n", a)
	fmt.Printf("%#v\n", b)
	fmt.Println(b.age)
}
//输出
// {{coco 3} 30}
// {{{KK 4} 20} 2000}
// main.cat{animal:main.animal{name:"coco", age:3}, speed:30}
// main.eagle{bird:main.bird{animal:main.animal{name:"KK", age:4}, weight:20}, flyHeight:2000}
// 4

2、结构体实现树形数据结构

例子中使用结构体构造了一个二叉树,实现插入排序,首先生成一个排序二叉树,再按照left、mid、left的顺序进行排序。

package main

import "fmt"

type tree struct {
	val  int
	l, r *tree
}

func main() {
	num := []int{9, 8, 7, 6, 5, 4, 3}
	num = sortTree(num)
	fmt.Println(num)
}

func sortTree(num []int) []int {
	var root *tree
	for _, v := range num {
		root = add(root, v)
	}
	num = num[:0]
	num = lmrFind(root, num)
	return num
}

//插入二叉树
func add(t *tree, val int) *tree {
	if t == nil {
		t = new(tree)
		t.val = val
		return t
	}
	if t.val > val {
		t.l = add(t.l, val)
	} else {
		t.r = add(t.r, val)
	}
	return t
}
//遍历二叉树
func lmrFind(t *tree, num []int) []int {
	if t != nil {
		num = lmrFind(t.l, num)
		num = append(num, t.val)
		num = lmrFind(t.r, num)
	}
	return num
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值