이전 강의에서 수량과 포인트에 대해 장바구니 물품을 가능한지 모두 확인했습니다. canbuy 변수가 false면 주문이 불가능하고, true면 가능한 것입니다. 불가능하면 "구매할 수 없습니다."를 출력하고 for문을 빠져나갑니다. 따라서
if bucketmenu == 1 {
if canbuy {
//주문
break
} else {
fmt.Println("구매할 수 없습니다.")
break
}
}형식을 만들 수 있습니다. 이제 주문 기능을 구현하는데 이제는 구매 기능과 거의 똑같습니다. 이 기능은 마찬가지로 따로 함수를 만들어 구현하겠습니다. 함수 이름은 bucketBuying()입니다.
장바구니에 접근해 구매 기능과 마찬가지로 (장바구니 품목 == 품목 리스트)면 장바구니 품목의 수량과 사용자의 포인트가 차감되어야합니다. 함수의 매개변수들은 (itm []item, byr *buyer)입니다. 품목의 수량을 장바구니 수량만큼 차감하고 사용자 포인트도 차감했다면 장바구니를 초기화하고 "주문이 접수됐습니다."를 출력합니다.
이렇게하면 장바구니의 품목 주문이 구현됩니다.
func bucketBuying(itm []item, byr *buyer) {
for index, val := range byr.shoppingbucket {
for i := range itm {
if itm[i].name == index {
itm[i].amount -= val // 수량 차감
byr.point -= itm[i].price * val // 포인트 차감
}
}
}
byr.shoppingbucket = map[string]int{} // 장바구니 초기화
fmt.Println("주문 접수 되었습니다.")
}if bucketmenu == 1 {
if canbuy {
bucketBuying(items, buyer)
break
} else {
fmt.Println("구매할 수 없습니다.")
break
}
}그리고 bucketBuying() 함수 내에서 장바구니의 물품이 존재하지 않는데 주문할 경우"주문 가능한 목록이 없습니다."를 panic으로 발생시키고 지난 강의와 같은 방법으로 복구합니다. 이렇게한다면
func bucketBuying(itm []item, byr *buyer) {
defer func() {
if r := recover(); r != nil {
fmt.Println("\n",r,"\n")
}
}()
if len(byr.shoppingbucket) ==0 {
panic("주문 가능한 목록이 없습니다.")
} else {
for index, val := range byr.shoppingbucket {
for i := range itm {
if itm[i].name == index {
itm[i].amount -= val // 수량 차감
byr.point -= itm[i].price * val // 포인트 차감
}
}
}
}
byr.shoppingbucket = map[string]int{} // 장바구니 초기화
fmt.Println("상품이 주문 접수 되었습니다.")
}형식으로 수정할 수 있습니다. 이제 1. 장바구니 상품 주문 2. 메뉴로 돌아가기까지 구현됐습니다. 그런데 주문할 수 없으면 장바구니에 등록된 품목을 수정할 수 있어야합니다. 그렇지 못하면 계속 주문이 불가능한 상태로 남아있기 때문입니다. 그래서 '장바구니 초기화' 기능을 추가해
- 장바구니 상품 주문
- 장바구니 초기화
- 메뉴로 돌아가기
메뉴 형식으로 기능을 추가해 봅니다. 당연히 장바구니를 초기화하려면 buyer.shoppingbucket = map[string]int{}를 사용하면 되겠죠? 초기화한 후에는 "장바구니를 초기화했습니다."를 출력합니다. 추가한 모습은 아래와 같습니다.
fmt.Println("1. 장바구니 상품 주문")
fmt.Println("2. 장바구니 초기화")
fmt.Println("3. 메뉴로 돌아가기")
fmt.Print("실행할 기능을 입력하시오 :")
fmt.Scanln(&bucketmenu)
fmt.Println()
if bucketmenu == 1 {
if canbuy {
bucketBuying(items, buyer)
break
} else {
fmt.Println("구매할 수 없습니다.")
break
}
} else if bucketmenu == 2{
buyer.shoppingbucket = map[string]int{} // 장바구니 초기화
fmt.Println("장바구니를 초기화했습니다.")
break
} else if bucketmenu == 3 {
fmt.Println()
break
} else {
fmt.Println("잘못된 입력입니다. 다시 입력해주세요.")
}