将字符串与嵌套映射连接时无法获得适当的输出
Can't get appropriate output while concating string with nested map
我是 galang 新手,我想用嵌套映射连接字符串。下面是给出的伪代码,指出我的错误。提前致谢
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)
}
输出:
Final String map[group:map[1: Hi ] user:map[2: William ] hashTag:map[1: sosos ]]
预期输出:
Final String map[group:map[1: Hi ] user:map[1: John, 2: William ] hashTag:map[1: sosos ]]
它可能与
重复
Runtime error: "assignment to entry in nil map"
Runtime error: assignment to entry in nil map
但不明白请提供解决方案。谢谢
问题是您在每次调用时都初始化 "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 提供的一些内置函数,如 strings.Split or strings.Trim* 函数。可能会有帮助。
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)
}
我是 galang 新手,我想用嵌套映射连接字符串。下面是给出的伪代码,指出我的错误。提前致谢
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)
}
输出: Final String map[group:map[1: Hi ] user:map[2: William ] hashTag:map[1: sosos ]]
预期输出:
Final String map[group:map[1: Hi ] user:map[1: John, 2: William ] hashTag:map[1: sosos ]]
它可能与
重复Runtime error: "assignment to entry in nil map"
Runtime error: assignment to entry in nil map
但不明白请提供解决方案。谢谢
问题是您在每次调用时都初始化 "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 提供的一些内置函数,如 strings.Split or strings.Trim* 函数。可能会有帮助。
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)
}