Go Can';使用嵌套映射关联字符串时无法获得适当的输出

Go Can';使用嵌套映射关联字符串时无法获得适当的输出,go,nested-map,Go,Nested Map,我是加朗的新手,我想用嵌套映射来连接字符串。下面是给出的伪代码,指出我的错误。提前谢谢 import ( "fmt" "strconv" ) func main() { str := "Hello @John martin #sosos &Hi @William " var key string = "" var ku int = 0 var kh int = 0 var kg int = 0 va

我是加朗的新手,我想用嵌套映射来连接字符串。下面是给出的伪代码,指出我的错误。提前谢谢

    import (
    "fmt"
    "strconv"
    )

    func main() {
    str := "Hello @John martin #sosos &Hi @William "
    var key string = ""
    var ku int = 0
    var kh int = 0
    var kg int = 0
    var id string
    var col string 
    var retMap = make(map[string]map[string]string)
    retMap[key] = make(map[string]string)    
    for i := 0; i < len(str); i++ {
      //fmt.Println(string(str[i]), " >> ", str[i])
      if str[i] == 64 || str[i] == 35 || str[i] == 38 {
        if str[i] == 64 {
          ku++
          key = "user"
          id = strconv.Itoa(ku)
      } else if str[i] == 35 {
        kh++
        key = "hashTag"
        id = strconv.Itoa(kh)
      } else {
        kg++
        key = "group"
        id = strconv.Itoa(kg)
      }
      retMap[key] = make(map[string]string) // If not assign here then it gives runtime error "panic: assignment to entry in nil map"
      for j := i + 1; j < len(str); j++ {
        col = col + string(str[j])
        if str[j] == 32 {
          j = len(str) - 1
          retMap[key][id] = retMap[key][id] + col
          col = " "
        }
      }
    }
 }
 fmt.Println("Final String ",retMap)
}
导入(
“fmt”
“strconv”
)
func main(){
str:=“你好@John martin#sosos&你好@William”
var key string=“”
var ku int=0
var kh int=0
变量kg int=0
变量id字符串
变量列
var retMap=make(map[string]map[string]string)
retMap[key]=make(map[string]string)
对于i:=0;i>”,str[i])
如果str[i]==64 | | str[i]==35 | | str[i]==38{
如果str[i]==64{
库++
key=“用户”
id=strconv.Itoa(ku)
}如果str[i]==35,则为else{
kh++
key=“hashTag”
id=strconv.Itoa(kh)
}否则{
千克++
key=“组”
id=标准重量(千克)
}
retMap[key]=make(map[string]string)//如果没有在此处赋值,则会出现运行时错误“panic:assignment to entry in nil map”
对于j:=i+1;j
输出: 最终字符串映射[组:映射[1:Hi]用户:映射[2:William]标签:映射[1:sosos]]

预期产出:

最终字符串映射[组:映射[1:Hi]用户:映射[1:John,2:William]标签:映射[1:sosos]]

它可能是复制品


但不明白,请给我一个解决方案。谢谢

问题在于,您正在初始化每个调用中“key”的嵌套映射,因此它总是覆盖以前的数据

那就换个台词吧

retMap[key] = make(map[string]string) // If not assign here then it gives runtime error "panic: assignment to entry in nil map"
到以下位置,您的代码将正常工作:

=_, ok := retMap[key]
if !ok {
    retMap[key] = make(map[string]string)
}
我只是检查为“key”存储的值是否存在,如果不存在,则初始化一个新映射


已更新

我还重写了您的代码,以使用Go提供的、as或函数的一些内置函数。这可能会有帮助

package main

import (
    "fmt"
    "strconv"
    "strings"
)

const str = "Hello @John martin #sosos &Hi @William "

func main() {
    retMap := make(map[string]map[string]string)
    retMap["group"] = make(map[string]string)
    retMap["user"] = make(map[string]string)
    retMap["hashTag"] = make(map[string]string)
    list := strings.Split(strings.TrimSpace(str), " ")

    for _, value := range list {
        firstCharacter := string(value[0])
        if firstCharacter == "@" {
            retMap["user"][strconv.Itoa(len(retMap["user"])+1)] = strings.TrimLeft(value, "@")
        } else if firstCharacter == "&" {
            retMap["group"][strconv.Itoa(len(retMap["group"])+1)] = strings.TrimLeft(value, "&")
        } else if firstCharacter == "#" {
            retMap["hashTag"][strconv.Itoa(len(retMap["hashTag"])+1)] = strings.TrimLeft(value, "#")
        }
    }

    fmt.Println("Final String ", retMap)
}

@SohailShaikh我更新了答案,为您提供了另一个您想要实现的代码解决方案。