[英]How to optimize performance with clear struct value in Go?
我的API服務器接受發布請求,並且請求主體為JSON,因此我創建了兩個結構對象以接受JSON字符串並將其持久化到數據庫中。但是每次接受請求時,我都需要一次又一次創建struct對象,我嘗試清除而不是重新創建它。演示代碼如下所示:
//The two struct
type Card struct {
Number string
Type string
}
type Person struct {
Name string
Cards []Card
}
var p Person
//parse JSON to the struct object
func init() {
str := `{"name":"aaa","cards":[{"number":"1","type":"visa"},{"number":"2","type":"mastercard"}]}`
json.Unmarshal([]byte(str), &p)
}
func PersistToDatabase() {
var err error
tx, err := db.Begin()
if err != nil {
return
}
defer func() {
if err != nil && tx != nil {
if err := tx.Rollback(); err != nil {
return
}
}
}
finish := make(chan bool)
stmt1, err := tx.Prepare(`insert into tb1(name) values(?)`)
if err != nil {
panic(err.Error())
}
defer stmt1.Close()
stmt2, err := tx.Prepare(`insert into tb2(name, num, type) values(?, ?, ?)`)
if err != nil {
panic(err.Error())
}
defer stmt2.Close()
go func() {
defer func() { finish <- true }()
if _, err = stmt1.Exec(p.name); err != nil {
log.Println("stmt1.Exec: ", err.Error())
return
}
for _, x := range p.Cards {
if _, err = stmt2.Exec(p.name, x.Number, x.Type); err != nil {
log.Println("stmt2.Exec: ", err.Error())
return
}
}
}
<-finish
//clear struct object
p.Name = ""
p.Cards = nil //have anything do this better?
}
在代碼底部,我清除了Name元素,但讓Cards元素設置為nil
,我該怎么做呢? 我的數據庫操作有什么問題嗎?
結構不是對象[1]。 雖然從根本上說它們都以某種方式混雜了有序數據,但結構實際上只是變量列表。 沒有調用構造函數。 沒有分配超出其成員元素的內存,也沒有在任何特殊位置分配內存。 (當然,即使在大多數面向對象的語言中,這也許也不算太貴,優化器有時還是很酷的)
type A struct {
I int
S string
}
var MyA A
確實與
var (
I int
S string
)
編寫類型為MyA = A{}
的零結構實際上等效於執行MyA.I = 0; MyA.S = ""
MyA.I = 0; MyA.S = ""
,它實際上等效於I = 0; S = ""
I = 0; S = ""
。 執行以上任何一項操作,都不會造成(大量)性能開銷。
這並不意味着結構沒有用。 從概念上講,它們在定義方法,填充數據(例如JSON等情況)方面特別有用。 但是它們沒有什么顯着不同。 最后,這是最重要的事情, 您是否在此代碼塊中概述了顯着的性能瓶頸 ? 如果沒有(我懷疑不是),請不要擔心,這可能很好。 :)
[1] Java或C#樣式的對象,從理論上講(即使不是在實踐中)也更昂貴。 不是不同的C ++對象(更像Go結構)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.