博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用golang的slice来模拟栈
阅读量:6217 次
发布时间:2019-06-21

本文共 1505 字,大约阅读时间需要 5 分钟。

  • slice(切片):底层数据结构是数组
  • stack(栈):一种先进后出的数据结构
普通版的模拟写入和读取的栈
package mainimport "fmt"//栈的特点是先进后出//使用一个切片的全局变量来模拟栈var stack []int//向栈中添加数据func push(value int) {    stack = append(stack, value)}//从栈中获取数据func pop() (int, bool) {    ok := false    value := 0    if len(stack) > 0 {        value = stack[len(stack)-1]        stack = stack[:len(stack)-1]        ok = true        return value, ok    } else {        return value, ok    }}func main() {    //向栈中添加数据    for i := 0; i < 10; i++ {        push(i)        fmt.Println(stack)    }    //从栈中获取数据    for {        v, ok := pop()        if ok {            fmt.Println(v)        } else {            break        }    }}

 

使用goroutine来异步读取栈中数据或往栈中写入数据
package mainimport (    "fmt")//栈的特点是先进后出//使用一个切片的全局变量来模拟栈var stack1 []int//此通道用于通知主协程已经完成操作了//但是此操作有可能不会输出全部数据//因为添加数据和获取数据是异步的//当获取数据的速度快于写入数据//便不会输出全部数据var e chan int = make(chan int)//向栈中添加数据func push1(value int) {    stack1 = append(stack1, value)    fmt.Println(stack1)}//从栈中获取数据func pop1() {    for {        if len(stack1) > 0 {            value := stack1[len(stack1)-1]            stack1 = stack1[:len(stack1)-1]            fmt.Println(value)        } else {            e <- 0        }    }}func main() {    for i := 0; i < 10; i++ {        go push1(i)    }    go pop1()    <-e}

 

输出:

[1][1 6 5 9 3 2 7 0 4][1 6 5 9 3 2 7 0 4 8][1 6 5][1 6][1 6 5 9 3 2 7 0][1 6 5 9][1 6 5 9 3 2][1 6 5 9 3 2 7]8407239561[1 6 5 9 3]

使用goroutine异步读取或者写入的时一定要注意通道的写法,很容易造成死锁

转载于:https://www.cnblogs.com/TimLiuDream/p/9902496.html

你可能感兴趣的文章
D10-Nginx-http_user_agent
查看>>
exchange 2013 lesson 9 - 证书服务
查看>>
postfix之dovecot详解
查看>>
Skype是台湾繁体中文,告诉大家变成简体的办法
查看>>
听同事说的一个论坛
查看>>
java常用类库
查看>>
代理模式
查看>>
我的友情链接
查看>>
Gary Cuba: 如何忘掉一个你爱的人(个人翻译)
查看>>
win 7安装maven
查看>>
Linux中find常见用法示例
查看>>
4.4.5 Main方法
查看>>
4.5 方法参数
查看>>
spark整合hive+hbase做数据实时插入及实时查询分析
查看>>
java采用jdbc连接操作数据库
查看>>
ASP.NET MVC 应用提速的十种方法
查看>>
1.3节 逻辑门与二进制数 part2
查看>>
不重装系统修复系统的一些实例
查看>>
异步GEI (2) 线程
查看>>
通过管理控制台和命令行两种方式新建邮箱数据库(exchange2010)
查看>>