【笔记】go语言--结构体,方法,包与封装
【笔记】go语言--结构体,方法,包与封装
结构体和方法
面向对象
- go语言仅支持封装,不支持继承和多态
- go语言没有class,只有struct
//结构的定义
type TreeNode struct {
Left,Right *TreeNode
Value int
}
//结构体的创建
root := TreeNode{Value: 3}
root.Left = &TreeNode{}
root.Right = &TreeNode{nil, nil,5}
root.Right.Left = new(TreeNode)
需要注意,不论地址还是结构本身,一律使用.来访问成员
//此为自定义工厂函数,接结构体的创建,go语言可实现返回局部变量
func createTreeNode(value int) *TreeNode {
return &TreeNode{Value: value}
}
root.Left.Right = createTreeNode(2)
使用自定义工厂函数,同时注意返回了局部变量的地址!
既然知道能够返回局部变量的地址,那么结构创建在堆上还是栈上了呢?
看情况,有go语言的编译器和运行环境来决定,如果这个局部变量让编译器认为没有取地址并且返回出去,认为这个局部变量不需要给外面使用,那么就会在栈上分配
但是,如果编译器认为这个局部变量通过取地址并且返回出去给别人用,那么这个局部变量就会在会在堆上分配,堆上分配完后,这个局部变量就会参与垃圾回收,等外部调用这个指针使用完后,这个指针就会被回收。
为结构体定义方法
//调用结构体,值接受者与指针接受者
//为结构体定义方法,显示定义和命名方法接受者
func (node treeNode) print() {
fmt.Print(node.value)
}
//使用指针作为方法接受者,只有使用指针才可以改变结构内容,同时nil指针也可以调用方法
func (node *treeNode) setValue(value int) {
node.value = value
}
func createNode(value int) *treeNode {
return &treeNode{value: value}
}
func main() {
var root treeNode
root = treeNode{value: 3}
root.left = &treeNode{}
root.right = &treeNode{5, nil, nil}
root.right.left = new(treeNode)
root.left.right = createNode(2)
root.right.left.setValue(4)
root.right.left.print()
}
//中序遍历
func ( node *treeNode) traverse() {
if node == nil {
return
}
node.left.traverse( )
node.print( )
node.right.traverse( )
}
值接收者vs指针接收者
- 要改变内容必须使用指针接收者
- 结构过大也考虑使用指针接收者
- —致性:如有指针接收者,最好都是指针接收者
- 值接收者是go语言特有的
- 值/指针接收者均可接收值/指针
包和封装
封装
- 名字一般使用CamelCase
- 首字母大写:public,代表全局可见,即公有方法
- 首字母小写:private,代表包内可见,即私有方法
包
- 每个目录一个包,包名可以和目录名不同名,但是建议同名
- main包中包含可执行入口
- 为结构定义的方法必须放在同一个包内
- 可以是不同的文件
问题:如果包是别人写的,我们如何调用?
如何扩充系统类型或者别人的类型
- 定义别名:最简单,别名是使用type 声明一个别名,然后给自己别名定义新的方法
- 使用组合:最常用,组合指的是用自己的type类型包装一个原来的类型
- 使用内嵌:需要省下许多代码,内嵌方式,在结构体中省略字段名,只包含一个指针类型名,则该类型的各个方法会被结构体继承,同时还可以重载原来类型的方法,也就是重新定义同名方法。类似于继承的关系
【笔记】go语言--结构体,方法,包与封装的更多相关文章
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- Go 语言 结构体和方法
@ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- Go语言学习笔记十: 结构体
Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...
- Linux C语言结构体-学习笔记
Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...
- 06. Go 语言结构体
Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...
- Go 结构体方法
#### Go 结构体方法本来今天有些事情忙的不准备更新内容了,后来提前完成了, 所以还是要更新了; 毕竟坚持本就是一件不容易的事情!加油,相信不管是大家还是我,都有一些事情想要做,那就坚持吧,剩下的 ...
- Go语言结构体(struct)
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
- 对嵌入式开发C语言结构体的一点总结
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
随机推荐
- 摆脱鼠标操作 - vscode - vim Ctrl + hjkl 我定位为 上下翻半页和行头行尾
为什么 摆脱鼠标操作 - vscode - vim Ctrl + hjkl 我定位为 上下翻半页和行头行尾 翻页和当前行的开头结尾 我觉得都是高频操作 实现 settings.json 还附加了几个其 ...
- 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 - ahk 脚本 - autoHotKey
为什么 摆脱鼠标系列 - vscode - Esc 返回时候 强制显示英文输入法 切换网页的时候,回来还是搜索输入法,就想到按esc,直接强制英文输入法 之前vim插件里面 用了一个 im-selec ...
- 用python生成正玄波信号源码解析
一 前记 项目需要生成不同频点的正玄波信号,没找到现成的软件,只能自己写一个了.顺便温习一下python. 二 源码解析: #!/usr/bin/python import numpy as np f ...
- vue通用的增删改查按钮组件
代码复用:这个组件可以在多个页面或组件中使用,避免了重复编写相同的按钮代码. 灵活性:通过showButtons属性,可以根据需要显示不同的按钮.默认情况下,它会显示添加.修改和删除按钮,但你也可以根 ...
- Android自定义View学习(1)——基础知识介绍
原文:Android自定义View学习(1)--基础知识介绍 - Stars-One的杂货小窝 准备学习自定义View,介绍一下先了解了下相关的前置基础知识,特此总结 本系列集合文章链接可访问Andr ...
- Python爬虫实战系列3:今日BBNews编程新闻采集
一.分析页面 打开今日BBNews网址 https://news.bicido.com ,下拉选择[编程]栏目 1.1.分析请求 F12打开开发者模式,然后点击Network后点击任意一个请求,Ctr ...
- Locust 断言的实现?
一.检查点的方式有哪些: 主要是python 内置的assert 断言(自动断言)还有locust 中的catch_response 断言(手动断言):那么这两者之间有什么区别呢? 其实主要区别在与生 ...
- uni学习笔记分享
目录介绍 01.遇到问题汇总 02.关于布局设置 03.基础语法总结 04.关于交互问题 06.关于回传数据 07.关于网络请求 08.关于页面刷新 09.关于注意问题 10.待解决和思考 01.遇到 ...
- C# 二维码生成、识别
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ‘MsBuild.exe‘ 不是内部或外部命令,也不是可运行的程序
方法一: 在系统环境变量中的path变量中添加一条路径: 32位环境 C:\Windows\Microsoft.NET\Framework\v4.0.30319 64位环境 C:\Windo ...