【笔记】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语言--结构体,方法,包与封装的更多相关文章

  1. Go语言 - 结构体 | 方法

    自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...

  2. Go 语言 结构体和方法

    @ 目录 1. 结构体别名定义 2. 工厂模式 3. Tag 原信息 4. 匿名字段 5. 方法 1. 结构体别名定义 变量别名定义 package main import "fmt&quo ...

  3. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  4. Go语言学习笔记十: 结构体

    Go语言学习笔记十: 结构体 Go语言的结构体语法和C语言类似.而结构体这个概念就类似高级语言Java中的类. 结构体定义 结构体有两个关键字type和struct,中间夹着一个结构体名称.大括号里面 ...

  5. Linux C语言结构体-学习笔记

    Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...

  6. 06. Go 语言结构体

    Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...

  7. Go 结构体方法

    #### Go 结构体方法本来今天有些事情忙的不准备更新内容了,后来提前完成了, 所以还是要更新了; 毕竟坚持本就是一件不容易的事情!加油,相信不管是大家还是我,都有一些事情想要做,那就坚持吧,剩下的 ...

  8. Go语言结构体(struct)

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...

  9. 对嵌入式开发C语言结构体的一点总结

    今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...

  10. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

随机推荐

  1. Alt+Space 快速打开切换程序 - Everything - AutoHotKey

    Alt+Space 快速打开切换程序 - Everything - AutoHotKey 需求 电脑切换任务 需要用鼠标找,效率比较低,用快捷键Alt+Space 打开列表,输入指定关键字回车,切换或 ...

  2. day01-数据库的安装和使用

    Java数据库的安装和使用 1.数据库的作用 一个问题:淘宝网.京东.微信抖音,都有各自的功能,那么我们退出系统的时候,为什么信息还在? 解决之道-文件,数据库 为了解决上诉问题,使用更加利于管理数据 ...

  3. Global AI Bootcamp 成都站 圆满结束!

    3月10日星期天下午2点「Global AI Bootcamp 2024 - 成都站」,在成都银泰中心蔚来汽车会议区圆满结束了! 本次活动共计吸引了约50名IT行业从业者线下参与,他们分别来自成都各行 ...

  4. 说JS作用域,就不得不说说自执行函数

    一个兜兜转转,从"北深"回到三线城市的小码农,热爱生活,热爱技术,在这里和大家分享一个技术人员的点点滴滴.欢迎大家关注我的微信公众号:果冻想 前言 不得不吐槽,学个JS,这个概念也 ...

  5. Salesforce LWC学习(四十三) lwc 零基础学习路径的视频已上传B站

    本篇参考:https://www.bilibili.com/video/BV1QM411G7pN/ 还记得salesforce零基础学习(一百二十五)零基础学习SF路径 中描述的那样,预计今年年底以前 ...

  6. 记录--微信小程序,uniapp,H5端发送,显示emoji表情

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 小伙伴们,在开发中有没有遇到过发布帖子或者实时聊天需要发送到一些emoji表情的. 但是每当我们直接将emoji表情提交到后台的接口又会报 ...

  7. js前端 md5加密

    1.在utils目录下新建md5.js 在这里,我把md5()这个方法使用export进行了导出,方便在其他地方使用es6 import 引入使用 /* * JavaScript MD5 1.0.1 ...

  8. linux系统centos7.9如何安装nginx

    1.官网下载nginx nginx官网:https://nginx.org/ 选择稳定版进行下载,也可以下载老版本,下载成功后上传到服务器. 2.使用wget下载 访问nginx官网,在下载页面鼠标右 ...

  9. c语言的一些类型声明符

    基本类型: char: 字符类型 int: 整数类型 float: 单精度浮点数类型 double: 双精度浮点数类型 void: 无类型 修饰符: short: 短整数类型 long: 长整数类型 ...

  10. 如在 Java 中分割 Excel 工作表

    前言 在Excel中创建的大多数商业报告不是单页的文档,而是包含了多个上下文相关的信息,这些信息被存储在多个工作表中.例如我们的一些地区销售报告.按部门分类的员工记录.每家店铺的库存清单等. 然而,随 ...