在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ map存入結(jié)構(gòu)體的指針和結(jié)構(gòu)體本身有什么區(qū)別嗎?

map存入結(jié)構(gòu)體的指針和結(jié)構(gòu)體本身有什么區(qū)別嗎?

一種是

mm := make(map[int]*struct)
ss := &struct{}

還有一種是

mm := make(map[int]struct)
ss := struct{}

最后

mm[1] = ss

請(qǐng)問一下這幾種寫法區(qū)別是什么呢?性能方面哪個(gè)更好啊?

另外我很好奇的是第一種寫法里面&struct{}難道是在堆上分配空間嗎?

我記得在c語(yǔ)言里面如果在函數(shù)里面直接初始化一個(gè)結(jié)構(gòu)體是在棧上操作的,如果僅僅把這個(gè)結(jié)構(gòu)體的指針存入一個(gè)數(shù)組里面,等函數(shù)返回之后這個(gè)結(jié)構(gòu)體就銷毀了。

golang為什么我見有人這樣寫也沒事呢?是底層操作方式不一樣嗎?

回答
編輯回答
笑忘初

一是存指針修改方便,直接使用map[0]的語(yǔ)法修改即可,不然就只能用中間變量整個(gè)struct重新賦值。
二是如果你的struct內(nèi)容太多,建議map存指針,避免取用的時(shí)候反復(fù)拷貝。即使map[0]這種取法取出來也只是原struct的拷貝。

2017年4月6日 11:02
編輯回答
敢試
  • map[int]struct {}不能修改struct內(nèi)的屬性
type SS struct {
    Name string
}

func main() {
    ss := SS{
        Name: "struct",
    }

    ms := make(map[int]SS)
    ms[1] = ss

    sp := &SS{
        Name: "pointer",
    }
    mp := make(map[int]*SS)
    mp[1] = sp

    //修改 struct 類型的,會(huì)報(bào)錯(cuò)
    //ms[1].Name = "new struct name"

    mp[1].Name = "new struct name"

    fmt.Printf("ss:%+v\n", ss)

    fmt.Printf("sp:%+v\n", sp)
}

至于性能,沒有在實(shí)際中測(cè)試過,不能下結(jié)論。性能和場(chǎng)景有很大關(guān)系

  • &struct{}這種,在棧還是堆分配,和struct的大小有關(guān)
type smallStruct struct {
    id int
}
type bigStruct struct {
    id [2E7]int64
}

func createStructSmall() {
    _ = &smallStruct{}
}

func createStructBig() {
    _ = &bigStruct{}
}

goos: linux
goarch: amd64
BenchmarkCreateSmallStruct-8       2000000000             0.27 ns/op           0 B/op           0 allocs/op
BenchmarkCreateBigStruct-8              200       9950261 ns/op    160006144 B/op           1 allocs/op
PASS
ok      _/home/singlethread/test/src/map    2.932

還要考慮逃逸分析,可以搜一下

2017年7月29日 21:48