本文将介绍如何使用go语言实现一个简单易懂的下单系统。
一、需求分析
我们需要一个简单易懂的下单系统,至少需要实现以下几个功能:
- 商品的展示和选择
- 购物车的功能
- 订单的生成与显示
考虑到我们的时间和精力有限,我们将只实现一个简单的商城系统,且我们只提供两个商品可供选择。这两个商品的信息如下:
| 商品名称 | 商品价格 |
|---|---|
| 商品1 | 10元 |
| 商品2 | 20元 |
我们需要在命令行中实现这个商城系统。
立即学习“go语言免费学习笔记(深入)”;
二、代码实现
- 创建商品结构体
我们首先需要创建一个结构体来存储商品信息,代码示例如下:
type product struct {
name string
price int
}
var products = []product{
{"商品1", 10},
{"商品2", 20},
}- 商品展示
我们需要实现一个函数来展示商品信息,代码示例如下:
func showProducts() {
fmt.Println("== 商品列表 ==")
for _, p := range products {
fmt.Printf("%s %d元\n", p.name, p.price)
}
fmt.Println("================")
}- 购物车实现
我们需要实现一个购物车结构体来存储用户选择的商品信息,代码示例如下:
type cart struct {
items map[string]int
}
func newCart() *cart {
return &cart{items: make(map[string]int)}
}
func (c *cart) addItem(name string, qty int) {
c.items[name] += qty
}
func (c *cart) clear() {
c.items = make(map[string]int)
}
func (c *cart) total() int {
total := 0
for name, qty := range c.items {
for _, p := range products {
if p.name == name {
total += p.price * qty
break
}
}
}
return total
}
func (c *cart) show() {
if len(c.items) == 0 {
fmt.Println("购物车为空")
return
}
fmt.Println("== 购物车 ==")
for name, qty := range c.items {
fmt.Printf("%s × %d\n", name, qty)
}
fmt.Printf("总计 %d元\n", c.total())
fmt.Println("============")
}- 下单实现
我们需要实现一个下单函数,即将购物车中的商品信息生成为订单,代码示例如下:
func checkout(c *cart) {
if len(c.items) == 0 {
fmt.Println("购物车为空")
return
}
// 生成订单
order := make(map[string]int)
for name, qty := range c.items {
order[name] = qty
}
// 清空购物车
c.clear()
fmt.Println("== 订单详情 ==")
for name, qty := range order {
for _, p := range products {
if p.name == name {
fmt.Printf("%s × %d\n", name, qty)
fmt.Printf("单价 %d元,总价 %d元\n", p.price, p.price*qty)
break
}
}
}
fmt.Printf("总计 %d元\n", c.total())
fmt.Println("============")
}- 命令行交互
我们需要实现一个命令行交互函数,供用户选择商品及数量,并完成下单,代码示例如下:
func interactive() {
scanner := bufio.NewScanner(os.Stdin)
c := newCart()
for {
showProducts()
c.show()
fmt.Print("请选择商品(输入商品编号):")
scanner.Scan()
id := scanner.Text()
if id == "q" {
break
}
var p product
for _, p = range products {
if p.name == id {
break
}
}
if p.price == 0 {
fmt.Printf("商品 %s 不存在\n", id)
continue
}
fmt.Print("请输入数量:")
scanner.Scan()
qtyStr := scanner.Text()
qty, err := strconv.Atoi(qtyStr)
if err != nil {
fmt.Println("输入的数量无效")
continue
}
c.addItem(p.name, qty)
}
checkout(c)
}三、完整代码
完整代码如下:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
type product struct {
name string
price int
}
var products = []product{
{"商品1", 10},
{"商品2", 20},
}
type cart struct {
items map[string]int
}
func newCart() *cart {
return &cart{items: make(map[string]int)}
}
func (c *cart) addItem(name string, qty int) {
c.items[name] += qty
}
func (c *cart) clear() {
c.items = make(map[string]int)
}
func (c *cart) total() int {
total := 0
for name, qty := range c.items {
for _, p := range products {
if p.name == name {
total += p.price * qty
break
}
}
}
return total
}
func (c *cart) show() {
if len(c.items) == 0 {
fmt.Println("购物车为空")
return
}
fmt.Println("== 购物车 ==")
for name, qty := range c.items {
fmt.Printf("%s × %d\n", name, qty)
}
fmt.Printf("总计 %d元\n", c.total())
fmt.Println("============")
}
func showProducts() {
fmt.Println("== 商品列表 ==")
for _, p := range products {
fmt.Printf("%s %d元\n", p.name, p.price)
}
fmt.Println("================")
}
func checkout(c *cart) {
if len(c.items) == 0 {
fmt.Println("购物车为空")
return
}
// 生成订单
order := make(map[string]int)
for name, qty := range c.items {
order[name] = qty
}
// 清空购物车
c.clear()
fmt.Println("== 订单详情 ==")
for name, qty := range order {
for _, p := range products {
if p.name == name {
fmt.Printf("%s × %d\n", name, qty)
fmt.Printf("单价 %d元,总价 %d元\n", p.price, p.price*qty)
break
}
}
}
fmt.Printf("总计 %d元\n", c.total())
fmt.Println("============")
}
func interactive() {
scanner := bufio.NewScanner(os.Stdin)
c := newCart()
for {
showProducts()
c.show()
fmt.Print("请选择商品(输入商品编号):")
scanner.Scan()
id := scanner.Text()
if id == "q" {
break
}
var p product
for _, p = range products {
if p.name == id {
break
}
}
if p.price == 0 {
fmt.Printf("商品 %s 不存在\n", id)
continue
}
fmt.Print("请输入数量:")
scanner.Scan()
qtyStr := scanner.Text()
qty, err := strconv.Atoi(qtyStr)
if err != nil {
fmt.Println("输入的数量无效")
continue
}
c.addItem(p.name, qty)
}
checkout(c)
}
func main() {
interactive()
}四、总结
本文简单介绍了如何使用Go语言实现一个简单易懂的下单系统,通过实现商品展示、购物车功能和订单生成与显示等功能,我们实现了一个有用的商城系统,具有一定的实用性和参考价值。在开发前,我们需要充分了解需求及目标,从而能够更好的完成产品开发,同时,Go语言的高效性和简洁性也为我们提供了可靠和高效的开发工具和支持。










