golang模拟抢票

golang模拟抢票

阻塞信道

package main

import (
	"fmt"
	"time"
)

func main() {
	count := 1000
	incs := make(chan int, 1)
	go func() {
		for i := count; i > 0; i-- {
			incs <- i
		}
	}()
	go func(chan int) {
		for {
			i := <-incs
			fmt.Println("A get ticket", i)
			time.Sleep(100)
		}
	}(incs)
	go func(chan int) {
		for {
			i := <-incs
			fmt.Println("B get ticket", i)
			time.Sleep(100)
		}
	}(incs)
	time.Sleep(2 * time.Second)
}

设置信道的容量为1,使其成为阻塞信道,起到阻塞协程的作用。
信道已满时,阻塞流入协程;信道为空时,阻塞流出协程。
time.Sleep(100)的作用是防止CPU被某一流出协程一直抢占。
time.Sleep(2 * time.Second)的作用是保证非主协程执行完毕。

互斥锁

package main

import (
	"fmt"
	"time"
	"sync"
)

func main() {
	count := 1000
	var l sync.Mutex
	go func(*int) {
		for count > 0 {
			l.Lock()
			fmt.Println("A get ticket", count)
			count--
			l.Unlock()
			time.Sleep(100)
		}
	}(&count)
	go func(*int) {
		for count > 0 {
			l.Lock()
			fmt.Println("B get ticket", count)
			count--
			l.Unlock()
			time.Sleep(100)
		}
	}(&count)
	time.Sleep(2 * time.Second)
}

备注:一定要在linux环境下运行

go run main.go
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的购票系统模拟golang实现,主要包括以下功能: 1. 用户选择演出场次和座位 2. 系统检查座位是否已经被预定 3. 系统返回总价并确认订单 ```go package main import ( "fmt" ) // 定义座位结构体 type Seat struct { row int col int price int status bool } // 定义演出场次结构体 type Show struct { name string seats [][]Seat } // 初始化演出场次 func initShow() Show { s := Show{ name: "猪八戒大闹天宫", seats: make([][]Seat, 10), } for i := range s.seats { s.seats[i] = make([]Seat, 10) for j := range s.seats[i] { s.seats[i][j] = Seat{ row: i + 1, col: j + 1, price: 100, status: false, } } } return s } // 显示演出场次座位情况 func showSeats(s Show) { fmt.Println(s.name) for i := range s.seats { for j := range s.seats[i] { if s.seats[i][j].status { fmt.Print("X ") } else { fmt.Print("O ") } } fmt.Println() } } // 计算总价 func calcTotalPrice(seats []Seat) int { total := 0 for _, seat := range seats { total += seat.price } return total } // 预定座位 func bookSeats(s Show, seats []Seat) { for _, seat := range seats { s.seats[seat.row-1][seat.col-1].status = true } } func main() { show := initShow() showSeats(show) // 用户选择座位 var row, col int var selectedSeats []Seat for i := 0; i < 2; i++ { // 每次最多选择2个座位 fmt.Print("请选择座位(行 列):") fmt.Scan(&row, &col) seat := show.seats[row-1][col-1] if seat.status { fmt.Println("该座位已经被预定,请重新选择!") continue } selectedSeats = append(selectedSeats, seat) fmt.Print("是否继续选择座位?(Y/N)") var input string fmt.Scan(&input) if input == "N" { break } } // 显示用户选择的座位和总价 fmt.Println("您选择的座位:") for _, seat := range selectedSeats { fmt.Printf("第%d排第%d列,价格%d元\n", seat.row, seat.col, seat.price) } totalPrice := calcTotalPrice(selectedSeats) fmt.Printf("总价:%d元\n", totalPrice) fmt.Print("确认订单?(Y/N)") var input string fmt.Scan(&input) if input == "Y" { bookSeats(show, selectedSeats) fmt.Println("预定成功!") showSeats(show) } else { fmt.Println("预定已取消!") } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值