package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
num := make(chan int, 1000) // 1000 - размер буфера канала
wg.Add(1)
go func() {
for {
val, ok := <-num
if !ok {
break
}
fmt.Printf("goroutine 1 got: %d\n", val)
time.Sleep(100 * time.Microsecond)
}
wg.Done()
}()
wg.Add(1)
go func() {
for {
val, ok := <-num
if !ok {
break
}
fmt.Printf("goroutine 2 got: %d\n", val)
time.Sleep(500 * time.Microsecond)
}
wg.Done()
}()
wg.Add(1)
go func() {
for i := 0; i < 1000; i++ {
num <- i
fmt.Printf("write to channel: %d\n", i)
}
close(num)
wg.Done()
}()
wg.Wait()
}
goroutine 1 got: 640
goroutine 1 got: 641
goroutine 1 got: 642
goroutine 2 got: 643
goroutine 1 got: 644
goroutine 1 got: 645
goroutine 1 got: 646
goroutine 1 got: 647
goroutine 2 got: 648
goroutine 1 got: 649
goroutine 1 got: 650
// OrderRequest запрос на оформление заказа.
type OrderRequest struct {
Products []OrderProduct `json:"items"`
Phone int `json:"phone"`
}
// OrderProduct запись товара.
type OrderProduct struct {
ID uint `gorm:"primaryKey;autoIncrement;unique" json:"id"`
OrderID uint `json:"-"`
ItemID uint `json:"item_id"`
Brand string `json:"brand"`
Img string `json:"img"`
ItemTotal uint `json:"item_total"`
Price string `json:"price"`
Quantity uint `json:"quantity"`
Title string `json:"title"`
Type string `json:"type"`
}
// Order структура заказа.
type Order struct {
ID uint `gorm:"primaryKey;autoIncrement;unique" json:"id"`
Owner string `json:"owner"`
Status string `gorm:"default:ordered"json:"status"`
Phone int `json:"phone"`
Products []OrderProduct `gorm:"foreignkey:OrderID" json:"order"`
// возможно foreignkey:order_id, не могу точно сказать, с GORM не работал ранее
}
func PostOrder(c *gin.Context) {
var req OrderRequest
if err := c.ShouldBindJSON(&req); err != nil {
fmt.Println(err.Error())
return
}
// т.к. мы используем одну структуру OrderProduct, чтобы избежать намеренного искажения данных кем-то
// обнулим эти поля.
for idx := range req.Products {
req.Products[idx].ID = 0
req.Products[idx].OrderID = 0
}
owner := c.Params.ByName("id")
order = Order{
Products: req.Products,
Owner: owner,
Status: "ordered",
Phone: orderRequest.Phone,
}
database.DB.Create(&order)
c.JSON(201, gin.H{"message": order})
}
// OrderProduct товар в заказе.
type OrderProduct struct {
ID uint `gorm:"primaryKey;autoIncrement;unique"json:"id"`
OrderID uint `json:"-"`
Brand string `json:"brand"`
ItemId int `json:"item_id"`
Img string `json:"img"`
ItemTotal int `json:"item_total"`
Price string `json:"price"`
Quantity int `json:"quantity"`
Title string `json:"title"`
Type string `json:"type"`
}
type Order struct {
...
// меняем тут тип
Order datatypes.JSON `json:"order"`
}
// заполняете orderStructures
// потом преобразуем структуры в []bytes,
jsonData, err := json.Marshal(orderStructures)
// потом заполняем поле
order.Order = datatypes.JSON(jsonData)
// тут сохраняем
если много ядер на процессоре - можно запустить столько же горутин сколько ядер и сделать чтобы каждая анализировала только отдельную часть файла
По сути это больше вопрос по структурам данных, чем по Go.
В общем если скорость ответа должна быть быстрой или производительность поиска с горутинами и файлом в памяти не подходит - дайте знать, придумаем что-то.