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 相关文章推荐
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Go语言-为什么返回值为接口类型,却返回结构体
Apr 24 Golang
用golang如何替换某个文件中的字符串
Apr 25 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
Golang之sync.Pool使用详解
May 06 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Golang解析JSON对象
Apr 30 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
2016/10/12 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
php实现在线考试系统【附源码】
2018/09/18 PHP
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
js怎么判断flash swf文件是否加载完毕
2014/08/14 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
2015/09/16 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
JavaScript禁止用户多次提交的两种方法
2016/07/24 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
jquery绑定事件 bind和on的用法与区别分析
2020/05/22 jQuery
[30:37]【全国守擂赛】第三周擂主赛 Dark Knight vs. Leopard Gaming
2020/05/04 DOTA
跟老齐学Python之通过Python连接数据库
2014/10/28 Python
Python 私有函数的实例详解
2017/09/11 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Python绘图实现显示中文
2019/12/04 Python
python全局变量引用与修改过程解析
2020/01/07 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
智能室内花园:Click & Grow
2021/01/29 全球购物
一套PHP的笔试题
2013/05/31 面试题
数学系个人求职信范文
2014/01/30 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
React Native项目框架搭建的一些心得体会
2021/05/28 Javascript
Python如何识别银行卡卡号?
2021/06/10 Python
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android