Golang中map的使用详解及注意事项

这篇具有很好参考价值的文章主要介绍了Golang中map的使用详解及注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

map

  • map是一个key-value的数据结构,又称为字段或关联数组

  • Golang自带的map是哈希表

  • 声明

  • import "fmt"func main() {
    	var a map[int]int
    	fmt.Println(a)}


  • slice,map和func不能作为键值

  • 声明map是不会分配内存的,初始化需要用make

  • import "fmt"func main() {
    	var a map[int]int
        a = make(map[int]int, 3)//可以存放三个键值对
    	fmt.Println(a)}


  • Go的map的键值是没有顺序的

  • 自动增长

  • func main() {
    	a := make(map[int]int)
    	a[1] = 2
    	a[2] = 1
    	fmt.Println(a)}


  • 直接初始化

  • func main() {
    	a := map[int]int{
    		1: 1,
    		2: 2,//这里也要,
    	}
    	fmt.Println(a)}


增加和更新

  • 直接给键值赋值即可

删除

  • delete(map, 1)//删除map键值为1的对,如果不存在不会操作


  • 如果要完全清空

  • 遍历key来删除,或者让map赋值一个新的map,给GC回收

查询

val, flag := mp[1] //flag是bool,找到是true,没找到是false,val是对应值


遍历(for-range)

  • func main() {
    	a := map[int]int{
    		1: 1,
    		2: 2,
    	}
    	for k, v := range a {
    		fmt.Println(k, v)
    	}
    	fmt.Println(a)}


map切片

  • 同样slice的用法,注意map也要make就行,相当于在底层维护一个map类型的数组

关于哈希表遍历的一点看法

  • 大概是这样的,在底层有一个迭代器链表,或者,有一个指针数组,每次存放一个指针,迭代器依次访问这些指针,但是在添加元素的时候, 会rehash,导致顺序变化。所以Go的设计者把他设置成无序,每次都打乱这个数组,防止程序员误用哈希map

对map的key排序

  • 将键值追加到切片内,然后对切片排序

  • import (
    	"fmt"
    	"sort")func main() {
    
    	mp := make(map[int]int, 10)
    	mp[1] = 2
    	mp[3] = 1
    	mp[2] = 5
    	mp[5] = 6
    	var keys []int //切片
    	for key, _ := range mp {
    		keys = append(keys, key)
    	}
    
    	sort.Ints(keys)
    	fmt.Println(keys)}


  • map是引用类型

结构体与OOP

声明、初始化、序列化

  • go语言是用struct来面向对象的

  • 声明

  • type Node struct {
    	X int
    	Y int}func main() {
    
    	var a Node//空间自动分配
    	fmt.Println(a)}//输出{0 0}


  • 赋值

  • func main() {
    
    	var a Node
    	a.X = 1
    	a.Y = 2
    	fmt.Println(a)}//输出{1 2}


  • 初始化

  • //方法一a := Node{1, 2}//方法二ptr *Node = new(Node)(*ptr).X = 1(*ptr).Y = 2//--------func main() {
    
    	var ptr *Node = new(Node)
    	(*ptr).X = 1
    	(*ptr).Y = 2
    	fmt.Println(*ptr)}//---底层自动识别,这样也可以func main() {
    
    	var ptr *Node = new(Node)
    	ptr.X = 1
    	ptr.Y = 2
    	fmt.Println(*ptr)}//方法三var node *Node = &Node{}


  • 结构体的所有字段在内存中是连续的

  • 两个结构体的字段类型完全相同的话可以强制类型转换

  • 用type struct1 struct2给struct2取别名,相当于定义了一个新的类型,两者之间可以强制类型转换,但是不能直接赋值

  • struct的每个字段上可以写上一个tag,该tag可以通过反射机制获取,常见于序列化和反序列化

  • 复习一个点,Go没有public和private,所以用首字母大写和小写来确定是公共的还是私有的

  • 序列化:对象转json字符串

  • 反序列化:json字符串转对象

  • 动手

  • import (
    	"encoding/json"
    	"fmt")type Node struct {
    	Name     string
    	Password string}func main() {
    
    	a := Node{
    		"aaaaaa",
    		"123456",
    	}
    
    	str, _ := json.Marshal(a)
    	fmt.Println(a)
    	fmt.Println(string(str))}//输出//{aaaaaa 123456}//{"Name":"aaaaaa","Password":"123456"}


  • 但是这种大写的变量很多客户端不习惯,所以使用tag,如果使用小写,就无法被结构体外部函数使用,无法序列化

  • import (
    	"encoding/json"
    	"fmt")type Node struct {
    	Name     string `json:"name"`
    	Password string `json:"password"`}func main() {
    
    	a := Node{
    		"aaaaaa",
    		"123456",
    	}
    
    	str, _ := json.Marshal(a)
    	fmt.Println(a)
    	fmt.Println(string(str))}//输出//{aaaaaa 123456}//{"name":"aaaaaa","password":"123456"}


方法

  • 方法是作用在指定类型上的函数

  • func (a Node) ok() {
        fmt.Println("ok")}//这个函数绑定给了Node//调用var a Node
    p.ok()


  • 动手

  • import (
    	"fmt")type Node struct {
    	Name     string `json:"name"`
    	Password string `json:"password"`}func (a Node) ok() {
    	fmt.Println(a.Name)}func main() {
    
    	a := Node{
    		"aaaaaa",
    		"123456",
    	}
    
    	a.ok()}//输出了Node的名字


  • 这个方法只能用指定类型来调用,不能直接调用

  • 如果想要修改原来的参数,我们使用结构体指针,并且这更常用,不用深拷贝,速度更快

  • type Node struct {
    	Name     string `json:"name"`
    	Password string `json:"password"`}func (a *Node) ok() {
    	a.Name = "bbbb"}func main() {
    
    	a := Node{
    		"aaaaaa",
    		"123456",
    	}
    
    	a.ok()//编译器底层自动识别变为&a
    
    	fmt.Println(a)}


  • 可以通过实现String方法,可以自定义格式化输出

工厂模式

  • 类似于构造函数,在结构体所在包下写相应构造的函数,返回结构体指针,这样就可以在结构体私有的情况下,在其他包调用这个函数直接返回结构体对象文章来源地址https://www.toymoban.com/news/detail-670400.html

到了这里,关于Golang中map的使用详解及注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git命令教程:如何有效地使用Git(附案例详解和注意事项)

    git 是一个分布式版本控制系统,用于敏捷高效地处理任何大小的项目。它是为了在Linux内核开发中更好地进行版本控制而由Linus Torvalds创建的。 git 是一个开源项目,自2005年以来,已经有超过550人为其贡献代码。这是一个在全球范围内被广泛使用的工具,无论是小型项目还是

    2024年02月03日
    浏览(42)
  • 如何使用Vscode开发Uni-app项目以及注意事项详解

    哟,大牛来了!!! 前言 :想必大家敲代码用的编辑器大多数都是Vscode吧,随着技术的更新,uni-app成为了前端不可或缺的一项技术,但是呢,官方推荐使用的HBuilderX编辑器让习惯了使用Vscode的我们不太习惯,虽然HBuilderX编辑器对uni-app极度的友好,但还是让在座的各位大牛以及

    2024年02月05日
    浏览(63)
  • Linux umount命令详解:如何使用umount命令卸载linux文件系统、卸载U盘、卸载软盘(附实例教程和注意事项)

    Linux umount命令用于卸除文件系统。umount可以卸除目前挂在Linux目录中的文件系统。这个命令的全称是unmount,意思是“卸载”。在Linux系统中,当我们需要对某个设备进行操作时,通常需要先将其挂载到文件系统中。当操作完成后,为了保证数据的完整性和一致性,通常会使用

    2024年02月02日
    浏览(60)
  • loss.item()用法和注意事项详解

    .item()方法是,取一个元素张量里面的 具体元素值 并返回该值,可以将一个零维张量转换成 int型或者float型 ,在计算loss,accuracy时常用到。 作用: 1.item()取出张量具体位置的元素元素值 2.并且返回的是该位置元素值的高精度值 3.保持原元素类型不变;必须指定位置 4.节省

    2023年04月18日
    浏览(42)
  • 详解MOS管并联注意事项和采取措施

    MOSFET管并联工作时,需要考虑两个问题: 1)满载时,并联器件完全导通时的静态电流分配是否均衡。 2)通断转换过程中它们的动态电流是否分配均衡。 在并联工作的情况下,无论是静态还是动态情况,如果一个MOSFET管分担了相对较多的电流,它发热将会更厉害,很容易造

    2024年02月07日
    浏览(43)
  • 学习Linux的注意事项(使用经验;目录作用;服务器注意事项)

    本篇分享学习Linux过程中的一些经验 Linux严格区分大小写 Linux中所有内容以文件形式保存 ,包括硬件,Linux是以管理文件的方式操作硬件 硬盘文件是 /dev/sd[a-p] 光盘文件是 /dev/sr0 等 对于设置需要写入文件,命令行的设置在重启之后就会失效,只有下入文件才可以保存下来 文

    2024年02月11日
    浏览(69)
  • Linux mount命令教程:详解文件系统挂载操作(附案例详解和注意事项)

    mount 命令在Linux中用于挂载Linux系统外的其它文件系统,每一个设备都必须先挂载后才能使用。此命令通常在系统引导时由系统启动脚本自动执行。 mount 命令在所有主流的Linux发行版中都是可用的,包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora和Raspb

    2024年03月14日
    浏览(81)
  • Linux mkdir命令教程:如何创建目录(附实例详解和注意事项)

    mkdir 命令在Linux系统中用于创建新的目录。 mkdir 是\\\"make directory\\\"的缩写,它可以帮助您通过一条命令就能创建目录。 mkdir 命令在所有主流的Linux发行版中都可以使用,包括但不限于Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian。这个命令是预装在这些系统中

    2024年04月22日
    浏览(88)
  • Linux tftp命令教程:文件传输利器(附案例详解和注意事项)

    tftp,全称为Trivial File Transfer Protocol(简单文件传输协议)。tftp是一个用于文件传输的客户端命令,用于从远程主机传输文件,包括一些非常简洁、通常嵌入的系统。 tftp命令适用于所有正在维护的Linux发行版本,如果在某些Linux版本上未预装此工具,可以通过对应的包管理器

    2024年03月13日
    浏览(195)
  • Linux usermod命令教程:如何修改用户属性(附案例详解和注意事项)

    usermod 命令是Linux系统中用来修改用户属性的命令。它可以修改用户的登录名、家目录、登录shell、用户组等信息。 usermod 命令在大多数Linux发行版中都是可用的,包括Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian等。如果在某些Linux发行版中没有预装此命令

    2024年04月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包