首页 > 编程语言 >go并发编程系列七:开学季抢票返程

go并发编程系列七:开学季抢票返程

时间:2023-09-04 20:55:34浏览次数:123  
标签:name train 季抢票 Add station 返程 func go ticket

背景:学校开学,3位同学要买票回校上课了,就有了这样一个购票程序,当然,实际情况复杂的多,本文仅供参考。

package main

import (
    "fmt"
    "sync"
)

type Train struct {
    station map[string]int
    mu sync.Mutex
}

func NewTrain() *Train {
    return &Train{station: map[string]int{}}
}

func (train *Train) Add(name string, ticket int) {
    train.mu.Lock()
    defer train.mu.Unlock()

    train.station[name] = ticket
}

func (train *Train) Buy(name string, ticket int) bool {
    train.mu.Lock()
    defer train.mu.Unlock()

    if train.station[name] == 0 || train.station[name] - ticket < 0 {
        return false
    }

    train.station[name] = train.station[name] - ticket

    return true
}

func main() {
    train := NewTrain()
    train.Add("郑州", 100)
    train.Add("许昌", 50)
    train.Add("漯河", 20)
    train.Add("驻马店", 50)
    train.Add("信阳", 30)

    var wg sync.WaitGroup
    wg.Add(3)

    go func() {
        defer wg.Done()

        ticket := 15
        own := train.Buy("信阳", ticket)
        fmt.Printf("张三购票:%d,状态:%t\n", ticket, own)
    }()

    go func() {
        defer wg.Done()

        ticket := 20
        own := train.Buy("信阳", ticket)
        fmt.Printf("李四购票:%d,状态:%t\n", ticket, own)
    }()

    go func() {
        defer wg.Done()

        ticket := 10
        own := train.Buy("信阳", ticket)
        fmt.Printf("王五购票:%d,状态:%t\n", ticket, own)
    }()

    wg.Wait()

    fmt.Println(train.station)
}

 

运行效果:

 

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
  TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back

标签:name,train,季抢票,Add,station,返程,func,go,ticket
From: https://www.cnblogs.com/jamstack/p/17678067.html

相关文章

  • go init
       https://blog.csdn.net/upstream480/article/details/128994361    init执行顺序          参考:https://blog.csdn.net/upstream480/article/details/128994361......
  • 【抽奖】重磅!Cloud Ace 荣获三项 2023 年 Google Cloud 年度合作伙伴大奖
    【CloudAce是GoogleCloud全球战略合作伙伴,在亚太地区、欧洲、南北美洲和非洲拥有二十多个办公室。CloudAce在谷歌专业领域认证及专业知识目前排名全球第一位,并连续多次获得GoogleCloud各类奖项。作为谷歌云托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证......
  • csgo如何显示帧数(含代码示例)
    CSGO可以通过控制台命令来显示帧数,代码如下:打开CSGO游戏,按下“~”键打开控制台;CSGO可以通过控制台命令来显示帧数,代码如下:1.打开CSGO游戏,按下“~”键打开控制台;2.在控制台输入“cl_showfps1”,即可开启帧数显示;3.若要关闭帧数显示,只需在控制台输入“cl_showfps0”即可。......
  • Golang Gorm 一对多查询 preload预加载
    预加载示例GORM允许使用 Preload通过多个SQL中来直接加载关系,例如:typeUserstruct{gorm.ModelUsernamestringOrders[]Order}typeOrderstruct{gorm.ModelUserIDuintPricefloat64}//查找user时预加载相关Orderdb.Preload("Orders").Fin......
  • go实现ping
     ping是一个经常被用来检查主机间连通性的工具,它基于ICMP协议实现,基本原理很简单:本机给远程机器发送ICMP报文,远程主机接收到ICMP报文后便会回复一个类似的ICMP报文;当本机接收到回复后变认为远程主机是可连接的,否则便认为这个主机是不可达的.为了了解go......
  • Go开始:Go基本元素介绍
    本文深入探讨了Go编程语言中的核心概念,包括标识符、关键字、具名函数、具名值、定义类型、类型别名、包和模块管理,以及代码块和断行。这些元素是构成Go程序的基础,也是编写高质量代码的关键。关注TechLeadCloud,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服......
  • golang编译go build -ldflags "-s -w"的 解释
    gobuild-ldflags"-s-w" 是一个Go语言的构建命令,其中使用了 -ldflags 参数来传递一些额外的链接器标志。这个命令中,-ldflags"-s-w" 传递了两个标志:-s:该标志会禁止生成可执行文件中的符号表信息,这样在执行文件时就不会暴露源代码中的函数名、变量名等符号信息。这有......
  • VSCode 配置python Django
    好吃vs占用的内存很少很轻量但是需要自己人肉配置核心两个点启动项目文件launch.json项目设置包括resthttpclientdjango.vscdoe新建launch.json{"version":"0.2.0","configurations":[{"name":"Python:Django&q......
  • 微服务发布到docker后,一直重启Restarting (1) 2 seconds ago.
     使用dockerlogs加容器的ID命令,就可以查看该容器的启动的具体信息了。dockerlogsc59ba37a2508看一下日志:根据具体的报错信息来处理就可以了。  ......
  • Google Chrome 最新版及历史版本下载
    (含更新组件)新版及历史版本https://www.lanzout.com/b0khja5ghttps://pan.baidu.com/s/1Q5FptUnS0BjGMk5erwOhyw 提取码:36oz......