亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用蘭特填充結構圖。Seed() 僅插入最后一個對象

使用蘭特填充結構圖。Seed() 僅插入最后一個對象

Go
素胚勾勒不出你 2022-08-24 16:08:22
我有下面的代碼,它的目的只是創建結構對象的映射,并調用一個復制映射然后打印它的函數。當我刪除所有內容中的行時,一切都有效(除了id,它對于每次運行都是常數,正如預期的那樣),否則它只會將最后一個元素添加到映射中。為什么會發生這種情況?ComicBookrand.Seed()SetId()comicBook.gopackage srcimport (    "math/rand"    "sync"    "time")type ComicBook struct {    id        int    name      string    publisher string    sold      bool}type Book interface {    GetId() int    SetId() int    GetName() string    GetPublisher() string    GetIsSold() bool    New(name string, author string) ComicBook}func (book ComicBook) SetId()  int{        rand.Seed(time.Now().UTC().UnixNano())        id := rand.Intn(100)        book.id = id    return id}func (book ComicBook) New(name string, author string) ComicBook {    id := book.SetId()    b := ComicBook{id, name, author, false}    return b}func (book ComicBook) GetId() int{    return book.id}func (book ComicBook) GetName() string{    return book.name}func (book ComicBook) GetPublisher() string{    return book.publisher}func (book ComicBook) GetIsSold() bool{    return book.sold}main.gopackage mainimport (    "awesomeProject1/src"    "fmt")var (    ComicBook src.ComicBook)func copyMap(m map[int]src.ComicBook) map[int]src.ComicBook {    newMap := make(map[int]src.ComicBook)    for k, v := range m {        newMap[k] = v    }    return newMap}func main()  {    b := src.ComicBook{}.New("A", "B")    bTwo := src.ComicBook{}.New("The Dark Knight Returns", "DC Comics")    bThree := src.ComicBook{}.New("Watchmen", "DC Comics")    m := map[int]src.ComicBook{        b.GetId():    b,        bTwo.GetId(): bTwo,        bThree.GetId(): bThree,    }    newMap := copyMap(m)    for k, v := range newMap {        fmt.Println("Id: ", k, ", Name: ", v.GetName(), ", Publisher: ", v.GetPublisher(), ", Sold: ", v.GetIsSold())    }}輸出:Id:  91 , Name:  Watchmen , Publisher:  DC Comics , Sold:  false
查看完整描述

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

}


查看完整回答
反對 回復 2022-08-24
?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

首先,您只能使用一次(例如 in 或 function)。rand.Seed()maininit

其次,可能會返回相同的值兩次(因為它是隨機的,而不是唯一的),這意味著先前的map記錄將被覆蓋。rand.Intn()

你的問題的解決方案將是更改函數,它返回隨機數,函數,返回一些標識符(如UUID)。


查看完整回答
反對 回復 2022-08-24
  • 2 回答
  • 0 關注
  • 91 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號