go语言map与string的相互转换的实现


Posted in Golang onApril 07, 2021

一.map转string

import (
 "encoding/json"
)
 
func MapToJson(param map[string]interface{}) string{
 dataType , _ := json.Marshal(param)
 dataString := string(dataType)
 return dataString
}

二.string转map

import (
 "encoding/json"
)
 
func JsonToMap(str string) map[string]interface{} {
 
 var tempMap map[string]interface{}
 
 err := json.Unmarshal([]byte(str), &tempMap)
 
 if err != nil {
 panic(err)
 }
 
 return tempMap
}

补充:Map的基本使用

1 Map介绍

Map 是 Go 中的内置类型,它将键与值绑定到一起。可以通过键获取相应的值。

可以通过将键和值的类型传递给内置函数 make 来创建一个 map。语法为:make(map[KeyType]ValueType)。(译者注:map 的类型表示为 map[KeyType]ValueType)例如:

personSalary := make(map[string]int)

上面的代码创建了一个名为 personSalary 的 map。其中键的类型为 string,值的类型为 int。

map 的 0 值为 nil。试图给一个 nil map 添加元素给会导致运行时错误。因此 map 必须通过 make 来初始化(译者注:也可以使用速记声明来创建 map,见下文)。

package main
import ( 
  "fmt"
)
 
func main() { 
  var personSalary map[string]int
  if personSalary == nil {
    fmt.Println("map is nil. Going to make one.")
    personSalary = make(map[string]int)
  }
}

2 Map插入元素

插入元素给 map 的语法与数组相似。下面的代码插入一些新的元素给 map personSalary。

func main() { 
  personSalary := make(map[string]int)
  personSalary["steve"] = 12000
  personSalary["jamie"] = 15000
  personSalary["mike"] = 9000
  fmt.Println("personSalary map contents:", personSalary)
}

也可以在声明时初始化一个数组:

func main() { 
  personSalary := map[string]int {
    "steve": 12000,
    "jamie": 15000,
  }
  personSalary["mike"] = 9000
  fmt.Println("personSalary map contents:", personSalary)
}

string 并不是可以作为键的唯一类型,其他所有可以比较的类型,比如,布尔类型,整型,浮点型,复数类型都可以作为键。

3 访问Map元素

根据键获取值的语法为:map[key],例如:

func main() { 
  personSalary := map[string]int{
    "steve": 12000,
    "jamie": 15000,
  }
  personSalary["mike"] = 9000
  employee := "jamie"
  fmt.Println("Salary of", employee, "is", personSalary[employee])
}

上面的程序非常简单。员工 jamie 的工资被取出并打印。程序的输出为:Salary of jamie is 15000。

如果一个键不存在会发生什么?map 会返回值类型的 0 值。比如如果访问了 personSalary 中的不存在的键,那么将返回 int 的 0 值,也就是 0。

我们如何检测一个键是否存在于一个 map 中呢?可以使用下面的语法:

value, ok := map[key]

上面的语法可以检测一个特定的键是否存在于 map 中。如果 ok 是 true,则键存在,value 被赋值为对应的值。如果 ok 为 false,则表示键不存在。

func main() { 
  personSalary := map[string]int{
    "steve": 12000,
    "jamie": 15000,
  }
  personSalary["mike"] = 9000
  newEmp := "joe"
  value, ok := personSalary[newEmp]
  if ok == true {
    fmt.Println("Salary of", newEmp, "is", value)
  } else {
    fmt.Println(newEmp,"not found")
  }
}

range for 可用于遍历 map 中所有的元素

package main
import "fmt"
func main() {
 personSalary := map[string]int{
 "steve": 12000,
 "jamie": 15000,
 }
 personSalary["mike"] = 9000
 fmt.Println("All items of a map")
 for key, value := range personSalary {
 fmt.Printf("personSalary[%s] = %dn", key, value)
 }
}

值得注意的是,因为 map 是无序的,因此对于程序的每次执行,不能保证使用 range for 遍历 map 的顺序总是一致的。

4 删除元素

delete(map, key) 用于删除 map 中的 key。delete 函数没有返回值。

func main() {
 personSalary := map[string]int{
 "steve": 12000,
 "jamie": 15000,
 }
 personSalary["mike"] = 9000
 fmt.Println("All items of a map")
 delete(personSalary, "steve")
 for key, value := range personSalary {
 fmt.Printf("personSalary[%s] = %dn", key, value)
 }
}

map 的大小

用内置函数 len 获取 map 的大小:

func main() { 
  personSalary := map[string]int{
    "steve": 12000,
    "jamie": 15000,
  }
  personSalary["mike"] = 9000
  fmt.Println("length is", len(personSalary))
}

map 是引用类型

与切片一样,map 是引用类型。当一个 map 赋值给一个新的变量,它们都指向同一个内部数据结构。因此改变其中一个也会反映到另一个:

func main() { 
  personSalary := map[string]int{
    "steve": 12000,
    "jamie": 15000,
  }
  personSalary["mike"] = 9000
  fmt.Println("Original person salary", personSalary)
  newPersonSalary := personSalary
  newPersonSalary["mike"] = 18000
  fmt.Println("Person salary changed", personSalary)
}

将 map 作为参数传递给函数也是一样的。在函数中对 map 的任何修改都会影响在调用函数中看到。

 比较 map

map 不能通过 == 操作符比较是否相等。== 操作符只能用来检测 map 是否为 nil。

func main() { 
  map1 := map[string]int{
    "one": 1,
    "two": 2,
  }
  map2 := map1
  if map1 == map2 {
  }
}

上面的程序将会报错:invalid operation: map1 == map2 (map can only be compared to nil)。

比较两个 map 是否相等的方式是一一比较它们的元素是否相等。大家自己实现一下即可。

//判断两个map是否相等
func mapAndmap(mymap1 map[string]int, mymap2 map[string]int) bool {
 //判断两个map长度是否相同 如果不判断可能会出现后面包含前面的问题
 if len(mymap1) != len(mymap2) {
 return false
 }
 //判断值是否相同
 for key, value := range mymap1 {
 if value != mymap2[key] {
  return false
 }
 }
 return true
}

到此这篇关于go语言map与string的相互转换的实现的文章就介绍到这了,更多相关go语言map与string相互转换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
golang中的空slice案例
Apr 27 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Go语言入门exec的基本使用
May 20 Golang
Golang实现可重入锁的示例代码
May 25 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
基于Python实现西西成语接龙小助手
Aug 05 Golang
Go各时间字符串使用解析
Apr 02 #Golang
Go Gin实现文件上传下载的示例代码
Apr 02 #Golang
一文读懂go中semaphore(信号量)源码
Apr 03 #Golang
Golang二维切片初始化的实现
Apr 08 #Golang
为什么不建议在go项目中使用init()
Apr 12 #Golang
Go语言操作数据库及其常规操作的示例代码
Apr 21 #Golang
golang判断key是否在map中的代码
Apr 24 #Golang
You might like
用php实现批量查询清除一句话后门的代码
2008/01/20 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
smarty缓存用法分析
2014/12/16 PHP
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
可以支持多中格式的JS键盘
2007/05/02 Javascript
jquery在Chrome下获取图片的长宽问题解决
2013/03/20 Javascript
js通过更改按钮的显示样式实现按钮的滑动效果
2014/04/23 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
Angular2搜索和重置按钮过场动画
2017/05/24 Javascript
angular过滤器实现排序功能
2017/06/27 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
基于Vue+element-ui 的Table二次封装的实现
2018/07/20 Javascript
Vue.set()动态的新增与修改数据,触发视图更新的方法
2018/09/15 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
[07:40]DOTA2每周TOP10 精彩击杀集锦vol.4
2014/06/25 DOTA
浅谈django中的认证与登录
2016/10/31 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
浅谈SciPy中的optimize.minimize实现受限优化问题
2020/02/29 Python
Python为何不支持switch语句原理详解
2020/10/21 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
大专生自荐书范文
2014/06/22 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
2016年国陪研修感言
2015/11/18 职场文书
有关保护环境的宣传标语100条
2019/08/07 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
golang DNS服务器的简单实现操作
2021/04/30 Golang
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
利用Apache Common将java对象池化的问题
2022/06/16 Servers