我的编程空间,编程开发者的网络收藏夹
学习永远不晚

go语言的栈与堆怎么使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

go语言的栈与堆怎么使用

本篇内容主要讲解“go语言的栈与堆怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言的栈与堆怎么使用”吧!

栈是一种数据结构,是为执行线程留出的内存空间;栈只允许往线性表的一端放入数据,之后在这一端取出数据,即按照先进后出,后进先出的顺序取出栈中的元素。堆是一种数据结构,是为动态分配预留的内存空间;和栈不一样,从堆上分配和重新分配块没有固定模式;你可以在任何时候分配和释放它。

Go语言的栈和堆

在编程语言中有两个非常重要的概念,堆和栈,

堆和栈是两种非常重要的数据结构,在编辑程序的时候会经常用到,Go语言也不例外。

下面我们来看看这两种数据结构。

栈只允许往线性表的一端放入数据,之后在这一端取出数据,即按照先进后出,后进先出的顺序取出栈中的元素。

往栈中放入元素的过程称为入栈。入栈会增加栈的元素数量,最后放入的元素是位于栈的顶部,最先放入的元素位于栈的底部。

从栈中取出元素时,只能从栈顶取出,取出元素后,栈的数量会变少,最先放入的元素总是最后被取出,最后放入的元素总是最先被取出。

go语言的栈与堆怎么使用

我们常使用数组来模拟一个栈的使用:

入栈和出栈的实现代码如下:

package mainimport (   "fmt"   "errors")//使用数组来模拟一个栈的使用type Stack struct {   MaxTop int       // 表示我们栈最大可以存放数个数   Top int          // 表示栈顶, 因为栈顶固定,因此我们直接使用Top   arr [5]int       // 用一个数组模拟栈}//入栈函数func (this *Stack) Push(val int) (err error) {   //先判断栈是否满了   if this.Top == this.MaxTop - 1 {      fmt.Println("stack full")      return errors.New("stack full")   }   this.Top++   //放入数据   this.arr[this.Top] = val   return}//出栈函数func (this *Stack) Pop() (val int, err error) {   //判断栈是否空   if this.Top == -1 {      fmt.Println("stack empty!")      return 0, errors.New("stack empty")   }   //先取值,再 this.Top--   val =  this.arr[this.Top]   this.Top--   return val, nil}//遍历栈,注意需要从栈顶开始遍历func (this *Stack) List() {   //先判断栈是否为空   if this.Top == -1 {      fmt.Println("stack empty")      return   }   fmt.Println("栈的情况如下:")   for i := this.Top; i >= 0; i-- {      fmt.Printf("arr[%d]=%d\n", i, this.arr[i])   }}func main() {   stack := &Stack{      MaxTop : 5,    // 表示最多存放5个数到栈中      Top : -1,      // 当栈顶为-1,表示栈为空   }   //入栈   stack.Push(1)   stack.Push(2)   stack.Push(3)   stack.Push(4)   stack.Push(5)   stack.List()//显示   //出栈   val, _ := stack.Pop()   fmt.Println("出栈val=", val)    // 5   stack.List()                    //显示}

堆在内存分配中类似于往一个房间里摆放各种家具,家具的尺寸有大有小,分配内存时,需要找一块足够装下家具的空间再摆放家具。

经过反复摆放和腾空家具后,房间里的空间会变得乱七八糟,此时再往这个空间里摆放家具会发现虽然有足够的空间,但各个空间分布在不同的区域,没有一段连续的空间来摆放家具。此时,内存分配器就需要对这些空间进行调整优化。

go语言的栈与堆怎么使用

堆分配内存和栈分配内存相比,堆适合不可预知大小的内存分配。

堆和栈的分配

变量定义完成一般是分配在堆和栈空间上的,存在哪个空间上是根据是否有动态分配内存有关(new/malloc)。

例如下面的案例

案例一

var p *int    //全局指针变量func f(){    var i int    i = 1    p = &i    //全局指针变量指向局部变量i}

案例二

func f(){    p := new(int) //局部指针变量,使用new申请的空间    *p = 1}

第一个案例中,使用var定义局部变量,但是由于i赋值给全局指针变量p,当函数结束,此时i并不会被释放,所以局部变量i是申请在堆上(程序员手动释放)。

  • 局部变量:在函数中定义的变量,它有一个动态的生命周期:每次执行的时候就创建一个新的实体,一直生存到没有人使用(例如没有外部指针指向它,函数退出的时候没有路径访问到这个变量)这个时候它占用的空间就会被回收

第二个案例中,使用new申请空间,由于退出函数后p就会被释放,所以p是申请在栈上(自动释放)

到此,相信大家对“go语言的栈与堆怎么使用”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

go语言的栈与堆怎么使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

go语言的栈与堆怎么使用

本篇内容主要讲解“go语言的栈与堆怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“go语言的栈与堆怎么使用”吧!栈是一种数据结构,是为执行线程留出的内存空间;栈只允许往线性表的一端放入数据
2023-07-04

go语言栈与堆都是什么

栈是一种数据结构,是为执行线程留出的内存空间;栈只允许往线性表的一端放入数据,之后在这一端取出数据,即按照先进后出,后进先出的顺序取出栈中的元素。堆是一种数据结构,是为动态分配预留的内存空间;和栈不一样,从堆上分配和重新分配块没有固定模式;你可以在任何时候分配和释放它。
2023-05-14

C语言栈、堆和静态存储区怎么使用

本文小编为大家详细介绍“C语言栈、堆和静态存储区怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言栈、堆和静态存储区怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、程序中的栈栈是现代计算机程
2023-06-30

C语言堆栈帧的介绍与创建方式

本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!什么是堆栈帧? 堆栈帧(stack frame)是一块堆
2023-06-20

go语言堆排序怎么实现

Go语言堆排序的实现步骤如下:首先,定义一个用于进行堆调整的函数 adjustHeap,该函数接受三个参数:待调整的切片 arr,当前需要调整的节点的下标 i,以及堆的大小 length。在 adjustHeap 函数中,首先获取当前节点
2023-10-22

C语言怎么实现堆及堆的结构与接口

本文小编为大家详细介绍“C语言怎么实现堆及堆的结构与接口”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现堆及堆的结构与接口”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、堆的结构及实现(重要)1.
2023-06-30

怎么使用GO语言

这篇文章主要讲解了“怎么使用GO语言”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用GO语言”吧!什么是 GVMGo 语言版本管理器(GVM)是管理 Go 语言环境的开源工具。GVM
2023-06-16

Go语言函数怎么定义与使用

今天小编给大家分享一下Go语言函数怎么定义与使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.前言函数是一段代码的片段,
2023-07-04

怎么使用Go语言的map

这篇文章主要讲解了“怎么使用Go语言的map”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Go语言的map”吧!语法声明和初始化配合make使用,否则是nilvar map[KeyT
2023-06-25

go语言的beego怎么使用

今天小编给大家分享一下go语言的beego怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。beego是一个使用Go语言
2023-07-04

Go语言的WaitGroup怎么使用

本篇内容介绍了“Go语言的WaitGroup怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!小试牛刀我们先来个简单的例子,看下 Wai
2023-07-02

Go语言数据结构探究:队列与栈的应用

go 语言中,队列遵守先进先出 (fifo) 原则,使用标准库中的 list 包实现,常用于消息传递系统;栈遵守后进先出 (lifo) 原则,常用于函数调用跟踪和括号匹配,可以使用切片实现。Go语言数据结构漫谈:队列与栈的应用队列队列是
Go语言数据结构探究:队列与栈的应用
2024-04-08

go语言堆排序的作用有哪些

Go语言堆排序的作用主要有以下几点:排序:堆排序是一种高效的排序算法,能够对一个无序的数组进行排序。它具有时间复杂度为O(nlogn)的特点,适用于大规模数据的排序。选择最大/最小元素:堆排序可以在O(1)的时间复杂度内找到最大或最小的元素
2023-10-27

Go语言中的函数与方法怎么使用

这篇文章主要介绍了Go语言中的函数与方法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言中的函数与方法怎么使用文章都会有所收获,下面我们一起来看看吧。函数定义语法与大部分语言一致,Go语言中的函数
2023-07-02

Go语言的exec怎么使用

本篇内容介绍了“Go语言的exec怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Exec 是 os 包中的一个子包,它可用于使用 G
2023-06-30

Go语言dolphinscheduler怎么使用

这篇文章主要介绍了Go语言dolphinscheduler怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go语言dolphinscheduler怎么使用文章都会有所收获,下面我们一起来看看吧。自动化为什
2023-07-02

Go语言的os包怎么使用

这篇“Go语言的os包怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言的os包怎么使用”文章吧。Go语言的 o
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录