go二叉树、struct、接口
二叉树实现、及遍历
二叉树定义
type Student struct {
Name string
left* Student
right* Student
}
如果每个节点有两个指针分别用来指向左子树和右子树,我们把这样的
结构叫做二叉树
package main import "fmt" type Student struct {
Name string
Age int
Score float32
left *Student
right *Student
} func trans(root *Student) {
if root == nil {
return
}
fmt.Println(root) trans(root.left)
trans(root.right) } func main() {
var root *Student = new(Student) root.Name = "stu01"
root.Age = 18
root.Score = 100 var left1 *Student = new(Student)
left1.Name = "stu02"
left1.Age = 18
left1.Score = 100 root.left = left1 var right1 *Student = new(Student)
right1.Name = "stu04"
right1.Age = 18
right1.Score = 100 root.right = right1 var left2 *Student = new(Student)
left2.Name = "stu03"
left2.Age = 18
left2.Score = 100 left1.left = left2 trans(root)
}
struct初始化
1、结构体是用户单独定义的类型,不能和其他类型进行强制转换
type Student struct {
Number int
} type Stu Student //alias var a Student
a = Student(30) var b Stu
a = b
2、golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题
Package model
type student struct {
Name stirng
Age int
} func NewStudent(name string, age int) *student {
return &student{
Name:name,
Age:age,}
} Package main
S := new (student)
S := model.NewStudent(“tony”, 20)
再次强调:
- make 用来创建map、slice、channel
- new用来创建值类型
struct中的tag
我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的
机制获取到,最常用的场景就是json序列化和反序列化
package main import (
"encoding/json"
"fmt"
) type Student struct {
Name string `json:"student_name"`
Age int `json:"age"`
Score int `json:"score"`
} func main() {
var stu Student = Student{
Name: "stu01",
Age: 18,
Score: 80,
} data, err := json.Marshal(stu)
if err != nil {
fmt.Println("json encode stu failed, err:", err)
return
} fmt.Println(string(data))
}
匿名字段
结构体中字段可以没有名字,即匿名字段
type Car struct {
Name stirng
Age int
} type Train struct {
Car
Start time.Time
int
}
exp:
package main import (
"fmt"
) type Cart1 struct {
name string
age int
} type Cart2 struct {
name string
age int
} type Train struct {
Cart1
Cart2
} func main() {
var t Train t.Cart1.name = "train"
t.Cart1.age = 100 fmt.Println(t)
}
匿名字段冲突处理
type Car struct {
Name string
Age int
} type Train struct {
Car
Start time.Time
Age int
}
type A struct {
a int
} type B struct {
a int
b int
} type C struct {
A
B
}
方法
1、Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以
有方法,而不仅仅是struct
定义:func (recevier type) methodName(参数列表)(返回值列表){}
2、方法和函数的区别
- 函数调用: function(variable, 参数列表)
- 方法:variable.function(参数列表)
3、指针receiver vs 值receiver
本质上和函数的值传递和地址传递是一样的
4. 方法的访问控制,通过大小写控制
exp:
package main import "fmt" type integer int func (p integer) print() {
fmt.Println("p is ", p)
} func (p *integer) set(b integer) {
*p = b
} type Student struct {
Name string
Age int
Score int
sex int
} func (p *Student) init(name string, age int, score int) {
p.Name = name
p.Age = age
p.Score = score
fmt.Println(p)
} func (p Student) get() Student {
return p
} func main() {
var stu Student
stu.init("stu", 10, 200) stu1 := stu.get()
fmt.Println(stu1) var a integer
a = 100
a.print() a.set(1000)
a.print()
}
5、继承
- 如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问匿名结构体的方法,从而实现了继承。
- 继承字段、继承方法
package main import "fmt" type Car struct {
weight int
name string
}
//继承方法
func (p *Car) Run() {
fmt.Println("running")
}
//继承
type Bike struct {
Car
lunzi int
}
//组合
type Train struct {
c Car
} func main() {
var a Bike
a.weight = 100
a.name = "bike"
a.lunzi = 2 fmt.Println(a)
a.Run()//继承 var b Train
b.c.weight = 100
b.c.name = "train" //组合
b.c.Run()
}
6、组合和匿名字段
- 如果一个struct嵌套了另一个匿名结构体,那么这个结构可以直接访问 匿名结构体的方法,从而实现了继承。
- 如果一个struct嵌套了另一个有名结构体,那么这个模式就叫组合。
7、多重继承
如果一个struct嵌套了多个匿名结构体,那么这个结构可以直接访问
多个匿名结构体的方法,从而实现了多重继承。
8、实现String()
- 如果一个变量实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出。
- 接口的一种实现方式
package main import "fmt" type Car struct {
weight int
name string
} func (p *Car) Run() {
fmt.Println("running")
} type Bike struct {
Car
lunzi int
} type Train struct {
Car
} func (p *Train) String() string {
str := fmt.Sprintf("name=[%s] weight=[%d]", p.name, p.weight)
return str
} func main() {
var a Bike
a.weight = 100
a.name = "bike"
a.lunzi = 2 fmt.Println(a)
a.Run() var b Train
b.weight = 100
b.name = "train"
b.Run() fmt.Printf("%s", &b)
}
接口
1. 定义
Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能
包含任何变量。
2. 定义
type example interface{
Method1(参数列表) 返回值列表
Method2(参数列表) 返回值列表
…
}
3. interface类型默认是一个指针
4. 接口实现
a. Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中
的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement
类似的关键字
b. 如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个
接口。
5. 接口实现
a. Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中
的所有方法,那么这个变量就实现这个接口。因此,golang中没有implement
类似的关键字
b. 如果一个变量含有了多个interface类型的方法,那么这个变量就实现了多个
接口。
c. 如果一个变量只含有了1个interface的方部分方法,那么这个变量没有实现
这个接口。
6. 多态
一种事物的多种形态,都可以按照统一的接口进行操作
package main import "fmt" type People struct {
name string
age int
} type Test interface {
Print()
Sleep()
} type Student struct {
name string
age int
score int
} func (p Student) Print() {
fmt.Println("name:", p.name)
fmt.Println("age:", p.age)
fmt.Println("score:", p.score)
} func (p Student) Sleep() {
fmt.Println("student sleep")
} func (people People) Print() {
fmt.Println("name:", people.name)
fmt.Println("age:", people.age)
} func (p People) Sleep() {
fmt.Println("people sleep")
} func main() { var t Test
fmt.Println(t)
//t.Print() var stu Student = Student{
name: "stu1",
age: 20,
score: 200,
} t = stu
t.Print()
t.Sleep() var people People = People{
name: "people",
age: 100,
} t = people
t.Print()
t.Sleep() fmt.Println("t:", t)
}
go二叉树、struct、接口的更多相关文章
- 二叉树 ADT接口 遍历算法 常规运算
BTree.h (结构定义, 基本操作, 遍历) #define MS 10 typedef struct BTreeNode{ char data; struct BTreeNode * lef ...
- Go语言学习之5 进阶-排序、链表、二叉树、接口
本节主要内容: 1. 结构体和方法2. 接口 1. 结构体和方法 (1). 用来自定义复杂数据结构 (2). struct里面可以包含多个字段(属性) (3). struct类型可以定 ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struc ...
- 二叉树的基本操作(含Huffman树)
大二时候写的烂代码,翻出来复习复习(o(╯□╰)o). 代码: #include <stdio.h> #include <stdlib.h> #define Max_Size ...
- 学习笔记——二叉树相关算法的实现(Java语言版)
二叉树遍历概念和算法 遍历(Traverse): 所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左. ...
- JS - 二叉树算法实现与遍历 (更新中...)
一.关于二叉树: 截图来自:https://segmentfault.com/a/1190000000740261 温馨提示:学习以及使用二叉树概念,心中永远有这么一个图,对于理解和接受二叉树有很大的 ...
- c++ 二叉树的遍历
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- c++ 创建二叉树
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
- (算法)二叉树的第m层第k个节点
题目: 给定以下二叉树: struct node { node *left, *right; int value; }; 要求编写函数 node* foo(node *node, unsigned i ...
随机推荐
- Myeclipse-10.7.1版本破解
自从上次写了IDEA2020版本破解方式,这次写一下Myeclipse10.7.1版本破解 下方链接是IDEA破解教程 点击即可跳转 Myeclipse下载地址这里我上传到了百度网盘 这里提取码 ...
- SpringCloud Bus 动态刷新全局广播和定点通知
全局广播 前提: 先具备良好的 RabbitMQ 环境 1. 演示广播效果,增加复杂度,再以3355为模板再制做一个3366模块 <!--pom.xml--> <?xml versi ...
- Python自动化运维:技术与最佳实践 PDF高清完整版|网盘下载内附地址提取码|
内容简介: <Python自动化运维:技术与最佳实践>一书在中国运维领域将有“划时代”的重要意义:一方面,这是国内第一本从纵.深和实践角度探讨Python在运维领域应用的著作:一方面本书的 ...
- 谁来教我渗透测试——黑客应该掌握的Windows基础
今天我们看看作为一个黑客对于Windows应该掌握哪些基础知识,主要内容包含以下四个方面: 系统目录.服务.端口和注册表: 黑客常用的DOS命令及批处理文件的编写: 黑客常用的快捷键,以及如何优化系统 ...
- Linux的VMWare中Centos7磁盘分区管理 fdisk分区和制作文件系统格式化和开机自动挂载
一.硬盘的组成零件扇区 磁道 磁盘容量 磁盘分区 简介 硬盘由容量.柱面数.磁头数.扇区数 C/H/S, Cylinder, Head, Sector(柱面/磁头数/扇区数) 1.磁头数表示硬盘总共有 ...
- LeetCode 87,远看是字符串其实是搜索,你能做出来吗?
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第54篇文章,我们一起来看LeetCode 87题,Scramble String(爬行字符串). 这题的官方难度 ...
- 正确的使用HttpClient
快捷的网络请求,多用HttpClient 但是常规的写法会一大片的TIME_OUT 比如这样的例子 static async Task<string> TestHttpClient(str ...
- 8月份Python招聘情况怎么样?Python爬取招聘数据,并进行分析
前言 拉勾招聘是专业的互联网求职招聘平台.致力于提供真实可靠的互联网招聘求职找工作信息.今天我们一起使用 python 采集拉钩的 python 招聘信息,分析一下找到高薪工作需要掌握哪些技术 开发环 ...
- Windows10 无法完全关闭Hyper-V导致VirtualBox 虚拟机无法启动
win10本来已经安装使用了VirtualBox. 突然心血来潮决定试试系统自带的虚拟机Hyper-V.发现并没有想象中的好用.随后在启用或关闭 Windows功能中关闭了Hyper-V. 这时我发现 ...
- Bytom侧链Vapor源码浅析-节点出块过程
Bytom侧链Vapor源码浅析-节点出块过程 在这篇文章中,作者将从Vapor节点的创建开始,进而拓展讲解Vapor节点出块过程中所涉及的源码. 做为Vapor源码解析系列的第一篇,本文首先对Vap ...