【问题标题】:how to pass golang map by value如何按值传递golang映射
【发布时间】:2020-05-26 08:49:54
【问题描述】:
AMap := make(map[int]int)
BMap := make(map[int]map[int]int)
var usersK []int
for i := 0; i < 10; i++ {
    var k int
    fmt.Scan(&k)
    AMap[k]++
    BMap[i] = AMap
}

在这种情况下,BMap 中的所有值都是同一个映射。如何通过值而不是引用传递 AMap。

【问题讨论】:

  • 地图是对底层结构的引用。如果你想传递地图的副本,你必须逐个元素地复制它并传递它。
  • 按值传递映射是不可能的,因为映射不是值。它是一组值,需要引用。
  • @zerkms,unsafe.Sizeof(map[string]string{}) = 4。 Map 是一个指向结构体的指针。
  • @zerkms 关键是它是一个指针,至少在这个实现中是这样。
  • @zerkms 很好。映射是指向描述映射的结构的指针...

标签: go


【解决方案1】:

您必须克隆地图对象才能做到这一点。但是,我认为你不会真的 ;-)。

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "reflect"
)

func Clone(a interface{}) interface{} {
    buff := new(bytes.Buffer)
    v := reflect.New(reflect.TypeOf(a))
    gob.NewEncoder(buff).Encode(a)
    gob.NewDecoder(buff).Decode(v.Interface())
    return v.Elem().Interface()
}

func main() {
    AMap := make(map[int]int)
    BMap := make(map[int]map[int]int)
    K := []int{9,8,7,6,5,4,3,2,1,0}
    for i := 0; i < 10; i++ {
        k := K[i]
        AMap[k]++
        BMap[i] = Clone(AMap).(map[int]int)
    }
    fmt.Println(BMap)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2016-02-09
    • 1970-01-01
    • 2017-07-05
    • 2012-02-06
    相关资源
    最近更新 更多