golang实现购票系统模拟
时间: 2023-07-16 07:14:04 浏览: 57
以下是一个简单的购票系统模拟的Go语言实现:
```go
package main
import (
"fmt"
"sync"
)
// Ticket represents a ticket for a specific seat
type Ticket struct {
seatNumber int
isSold bool
}
// SeatMap represents the seating arrangement for the event
type SeatMap struct {
tickets []*Ticket
mutex sync.Mutex
}
// NewSeatMap creates a new seat map with n tickets
func NewSeatMap(n int) *SeatMap {
tickets := make([]*Ticket, n)
for i := 0; i < n; i++ {
tickets[i] = &Ticket{seatNumber: i + 1}
}
return &SeatMap{tickets: tickets}
}
// SellTicket sells a ticket for a specific seat
func (s *SeatMap) SellTicket(seatNumber int) error {
s.mutex.Lock()
defer s.mutex.Unlock()
if seatNumber < 1 || seatNumber > len(s.tickets) {
return fmt.Errorf("invalid seat number")
}
ticket := s.tickets[seatNumber-1]
if ticket.isSold {
return fmt.Errorf("ticket already sold")
}
ticket.isSold = true
return nil
}
// AvailableSeats returns the number of available seats
func (s *SeatMap) AvailableSeats() int {
s.mutex.Lock()
defer s.mutex.Unlock()
count := 0
for _, ticket := range s.tickets {
if !ticket.isSold {
count++
}
}
return count
}
func main() {
seatMap := NewSeatMap(10)
// Sell a ticket for seat 3
err := seatMap.SellTicket(3)
if err != nil {
fmt.Println(err)
}
// Sell a ticket for seat 3 again (should fail)
err = seatMap.SellTicket(3)
if err != nil {
fmt.Println(err)
}
// Sell a ticket for an invalid seat number (should fail)
err = seatMap.SellTicket(11)
if err != nil {
fmt.Println(err)
}
// Print the number of available seats (should be 8)
fmt.Println(seatMap.AvailableSeats())
}
```
该代码实现了一个简单的购票系统模拟,包括创建座位地图、出售票、检查可用座位等功能。SeatMap 结构体包含一个 Ticket 切片,每个 Ticket 包含座位编号和是否已售出的标志。SellTicket 方法使用互斥锁保证线程安全性,并检查座位号是否有效以及座位是否已售出。AvailableSeats 方法同样使用互斥锁保证线程安全性,并统计未售出的座位数量。