2 回答

TA貢獻1842條經驗 獲得超22個贊
你使用不安全的方法來生成id.我測試你的代碼:
https://play.golang.org/p/S0_CWMqNH2-
rand.Seed(time.Now().UTC().UnixNano())
fmt.Println(time.Now().UTC().UnixNano())
id := rand.Intn(100)
fmt.Println(id)
這未保存。你可以認為,相同的鍵可以是1/100但是。你沒有讀到這些操作之間的時間可能太短,因此,密鑰本身與我的測試相同:
1257894000000000000
0
1257894000000000000
0
1257894000000000000
0
使用單個變量來保存你的種子,就像這樣:(我使用全局變量,但你可以在 ComicBook 結構中添加種子 var)
import (
"math/rand"
"fmt"
)
var seed int
...
func (book *ComicBook) SetId() int{
seed += 1
rand.Seed(int64(seed))
id := rand.Intn(100)
和測試:
1
81
2
86
3
8
在你的代碼中,任何地圖元素都有0個鍵并相互重寫,但現在:
map[8:{8 false} 81:{81 false} 86:{86 false}]
map[8:{8 false} 81:{81 false} 86:{86 false}]
Id: 86 , Name: , Publisher: , Sold: false
Id: 8 , Name: , Publisher: , Sold: false
Id: 81 , Name: , Publisher: , Sold: false
https://play.golang.org/p/Z9_tFNdlBqp
并且,如果將變量用于 id,則無需使用 rand:
func (book *ComicBook) SetId() int{
seed += 1
book.id = seed
fmt.Println(book.id)
return seed
}

TA貢獻2080條經驗 獲得超4個贊
首先,您只能使用一次(例如 in 或 function)。rand.Seed()
main
init
其次,可能會返回相同的值兩次(因為它是隨機的,而不是唯一的),這意味著先前的map記錄將被覆蓋。rand.Intn()
你的問題的解決方案將是更改函數,它返回隨機數,函數,返回一些標識符(如UUID)。
- 2 回答
- 0 關注
- 91 瀏覽
添加回答
舉報