V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
hcyg
V2EX  ›  Go 编程语言

Go map[int]转[]string 的问题 很神奇

  •  
  •   hcyg · 2020-02-08 19:15:10 +08:00 · 3368 次点击
    这是一个创建于 1750 天前的主题,其中的信息可能已经有所发展或是发生改变。
    if data,ok := data.(map[int]string);ok {
    	s := make([]string,len(data))
    	count := 0
    	fmt.Println("this is map[int][]string:-->",data)
    	for _,v := range data {
    		fmt.Println("this is v:-->",v)
    		s[count] = v
    		fmt.Println("this is s:-->",s)
    	}
    }
    

    这是一部分的代码 主要是将 map 转成 string 数组,但是结果如下:

    this is map[int][]string:--> map[2:32||159_tea222r||0||0 9:32||159_tea2222332r||0||0 19:32||159_tea22345762r||0||0]
    
    this is v:--> 32||159_tea22345762r||0||0
    this is s:--> [32||159_tea22345762r||0||0  ]
    this is v:--> 32||159_tea2222332r||0||0
    this is s:--> [32||159_tea2222332r||0||0  ]
    this is v:--> 32||159_tea222r||0||0
    this is s:--> [32||159_tea222r||0||0  ]
    

    赋值不了给 s 只有一个可以赋值

    如果我是连接成一个字符串就可以 这个 data 是我经过对比 delete 之后得出来的

    第 1 条附言  ·  2020-02-08 22:11:34 +08:00
    count++我代码里面是有的 这里我忘记加上去了
    第 2 条附言  ·  2020-02-08 22:13:46 +08:00
    debug 的时候 map 里面只有一个键有值 其他的都都是 key -> ,打印的时候又是全部都有
    11 条回复    2020-02-09 12:17:42 +08:00
    znood
        1
    znood  
       2020-02-08 19:27:01 +08:00   ❤️ 1
    楼主不妨每次用完 count 给人家 +1 个鸡腿呢😉
    mocos
        2
    mocos  
       2020-02-08 19:27:52 +08:00
    for-range 时 v 是复制切片的的值,然而 v 的指针地址是没变的。所以迭代完成的时候,因为读取的 v 的指针,v 的地址被写入,装入的值也是最后迭代的值
    xsephiroth
        3
    xsephiroth  
       2020-02-08 19:39:46 +08:00 via iPhone
    能取个 idx 或者 count++吗,自己的代码稍微看看吧
    stevenbipt
        4
    stevenbipt  
       2020-02-08 19:59:41 +08:00
    count 值一直没变吧???
    SingeeKing
        5
    SingeeKing  
       2020-02-08 20:36:42 +08:00
    if data,ok := data.(map[int]string);ok {
    s := make([]string,len(data))
    fmt.Println("this is map[int][]string:-->",data)
    for i,v := range data {
    fmt.Println("this is v:-->",v)
    s[i] = v
    fmt.Println("this is s:-->",s)
    }
    }
    fantastM
        6
    fantastM  
       2020-02-08 21:22:49 +08:00   ❤️ 1
    count++ 正解,不过也可以这样
    ```go
    data := map[int]string{
    1: "one",
    2: "tow",
    3: "three",
    }

    var s []string
    for _, val := range data {
    s = append(s, val)
    }
    ```
    gamexg
        7
    gamexg  
       2020-02-08 21:35:15 +08:00
    我习惯这样:

    ``` go

    if data,ok := data.(map[int]string);ok {
    s := make([]string,0,len(data))
    for _,v := range data {
    s=append(s,v)
    }
    }

    ```
    hcyg
        8
    hcyg  
    OP
       2020-02-08 22:10:17 +08:00
    count++ 我漏加上去 我代码里面是又 count++的
    petelin
        9
    petelin  
       2020-02-08 23:03:47 +08:00 via iPhone
    这是 string
    index90
        10
    index90  
       2020-02-09 12:16:43 +08:00 via iPhone
    Make 的时候你只设了容量,没有设长度
    zwpaper
        11
    zwpaper  
       2020-02-09 12:17:42 +08:00 via iPhone
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2842 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:51 · PVG 21:51 · LAX 05:51 · JFK 08:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.