【笔记】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语言结 ...
随机推荐
- koa 文件下载 pdf预览 两个接口 - nodejs - chromeDownload chromePreview
koa 文件下载 pdf预览 两个接口 - nodejs - chromeDownload chromePreview chrome.js const router = require("k ...
- python计算二进制bin文件hash值
一 hash的价值 hash值的唯一性仅仅在是同一个文件的情况下得到了同样的hash值,而哪怕错误一个字节也会得到不一样的hash值. hash值得最大价值就是唯一性.这样在bin文件检查和校验这块用 ...
- 3DCAT荣获2021金陀螺“年度XR行业技术创新奖”“年度优秀VR行业应用奖”两项大奖
作为年度行业影响力大奖,第六届金陀螺颁奖典礼与2021未来商业生态链接大会(简称"FBEC2021")同期举办.金陀螺奖金陀螺奖旨在对优质作品/项目及优秀企业做出嘉奖,鼓励创业者. ...
- C++ 构造函数 explicit 关键字 成员初始化列表
通常,构造函数具有public可访问性,但也可以将构造函数声明为 protected 或 private.构造函数可以选择采用成员初始化表达式列表,该列表会在构造函数主体运行之前初始化类成员.与在构造 ...
- 三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨
三维模型OBJ格式轻量化压缩处理效率提高的技术方法探讨 要提高三维模型OBJ格式轻量化压缩处理的效率,可以采取以下方法: 1.优化算法选择:选择合适的优化算法对模型进行轻量化处理.不同的优化算法有不同 ...
- 网站https 问题记录
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 开发过程中 常见的 https 问题 - 避坑 做前端多年,发现有些问题需要重复解决很多次,浪费了不少时间,https 导致的问题就属于其 ...
- Circle Loss:从统一的相似性对的优化角度进行深度特征学习 | CVPR 2020 Oral
论文提出了Circle loss,不仅能够对类内优化和类间优化进行单独地处理,还能根据不同的相似度值调整对应的梯度.总体而言,Circle loss更灵活,而且优化目标更明确,在多个实验上都有较好的表 ...
- Android实现简单登录界面
LoginActivity 1 package com.example.myapplication; 2 3 import android.os.Bundle; 4 import android.vi ...
- #插头dp#洛谷 5074 HDU 1693 Eat the Trees
题目 给出 \(n*m\) 的方格,有些格子不能铺线, 其它格子必须铺,可以形成多个闭合回路. 问有多少种铺法? \(n,m\leq 12\) 分析 设 \(dp[n][m][S][0/1]\) 表示 ...
- #并查集,单调栈#美团2018年CodeM大赛-决赛 C-Traffic
题目 分析 首先如果枚举起点\(i\),点\(i\)到点\(j\)(i<j)的距离跳到点\(k\)(k<i)一定不优,所以可以先处理这种情况, 用单调栈维护\(dp\)单调递增,并且如果栈 ...