2 回答
TA贡献1842条经验 获得超21个赞
你使用不安全的方法来生成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 关注
- 73 浏览
添加回答
举报