# Go学习-Day5

文章目录

    • map
      • 增加和更新
      • 删除
      • 查询
      • 遍历(for-range)
      • map切片
      • 关于哈希表遍历的一点看法
      • 对map的key排序
    • 结构体与OOP
      • 声明、初始化、序列化
      • 方法
      • 工厂模式

  • 个人博客:CSDN博客

map

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

  • Golang自带的map是哈希表

  • 声明

  • import "fmt"func main() {var a map[int]intfmt.Println(a)
    }
    
  • slice,map和func不能作为键值

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

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

  • 自动增长

  • func main() {a := make(map[int]int)a[1] = 2a[2] = 1fmt.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] = 2mp[3] = 1mp[2] = 5mp[5] = 6var keys []int //切片for key, _ := range mp {keys = append(keys, key)}sort.Ints(keys)fmt.Println(keys)
    }
    
  • map是引用类型

结构体与OOP

声明、初始化、序列化

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

  • 声明

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

  • func main() {var a Nodea.X = 1a.Y = 2fmt.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 = 2fmt.Println(*ptr)}
    //---底层自动识别,这样也可以
    func main() {var ptr *Node = new(Node)ptr.X = 1ptr.Y = 2fmt.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     stringPassword 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()//编译器底层自动识别变为&afmt.Println(a)
    }
  • 可以通过实现String方法,可以自定义格式化输出

工厂模式

  • 类似于构造函数,在结构体所在包下写相应构造的函数,返回结构体指针,这样就可以在结构体私有的情况下,在其他包调用这个函数直接返回结构体对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/110446.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elasticsearch中倒排索引、分词器、DSL语法使用介绍

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Spring Cloud Nacos 和 Eureka区别,包含实战代码

目录 一、Spring Cloud Eureka详解二、Spring Cloud Nacos详解三、Spring Cloud Nacos和Eureka区别 Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服务框架中的服务注册和发现组件,用于帮助开发者轻松地构建和管理微服务应用。它们之间的主要区别…

pytestx容器化执行引擎

系统架构 前端、后端、pytest均以Docker容器运行服务,单独的容器化执行引擎,项目环境隔离,即用即取,用完即齐,简单,高效。 前端容器:页面交互,请求后端,展示HTML报告 后…

RHCE——十一、NFS服务器

NFS服务器 一、简介1、NFS背景介绍2、生产应用场景 二、NFS工作原理1、示例图2、流程 三、NFS的使用1、安装2、配置文件3、主配置文件分析3.1 实验1 4、NFS账户映射4.1 实验24.2 实验3 四、autofs自动挂载服务1、产生原因2、安装3、配置文件分析4、实验45、实验5 一、简介 1、…

归一化的作用,sklearn 安装

目录 归一化的作用: 应用场景说明 sklearn 准备工作 sklearn 安装 sklearn 上手 线性回归实战 归一化的作用: 归一化后加快了梯度下降求最优解的速度; 归一化有可能提高精度(如KNN) 应用场景说明 1)概率模型不需要归一化&#xff…

FusionAD:用于自动驾驶预测和规划任务的多模态融合

论文背景 自动驾驶(AD)任务通常分为感知、预测和规划。在传统范式中,AD中的每个学习模块分别使用自己的主干,独立地学习任务。 以前,基于端到端学习的方法通常基于透视视图相机和激光雷达信息直接输出控制命令或轨迹…

基于Spring实现博客项目

访问地址:用户登录 代码获取:基于Spring实现博客项目: Spring项目写博客项目 一.项目开发 1.项目开发阶段 需求评审,需求分析项目设计(接口设计,DB设计等,比较大的需求,需要设计流程图,用例图,UML, model中的字段)开发+自测提测(提交测试…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字:阿玥的小东东 学习:Python、C/C 主页链接:阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…

计算机视觉与人工智能在医美人脸皮肤诊断方面的应用

一、人脸皮肤诊断方法 近年来,随着计算机技术和人工智能的不断发展,中医领域开始逐渐探索利用这些先进技术来辅助面诊和诊断。在皮肤望诊方面,也出现了一些现代研究,尝试通过图像分析技术和人工智能算法来客观化地获取皮肤相关的…

循环购商业模式:提升复购率与用户价值的创新策略-微三云门门

亲爱的企业家们,我是微三云门门!今天,我将为大家详细介绍一种颠覆性的商业模式:循环购商业模式。这个模式不仅可以帮助企业提升平台的复购率,还能够拉新用户并提升用户的消费率。让我们一起深入了解这个引人注目的商业…

Ubuntu 下安装Qt5.12.12无法输入中文解决方法

Ubuntu 下安装Qt5.12.12无法输入中文解决方法 一,环境: (1)VMware Workstation 15 Pro (2)Ubuntu 20.04 (3)Qt 5.12.12 64bits (4)Qt Creator 5.0.2 &#…

Hadoop Yarn 核心调优参数

文章目录 测试集群环境说明Yarn 核心配置参数1. 调度器选择2. ResourceManager 调度器处理线程数量设置3. 是否启用节点功能的自动检测设置4. 是否将逻辑处理器当作物理核心处理器5. 设置物理核心到虚拟核心的转换乘数6. 设置 NodeManager 使用的内存量7. 设置 NodeManager 节点…

ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红

a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景,都是后端返回html结构,前端直接渲染实现,但是如果需要前端处理的话,实现也是很简单的,接下来我直接上应用场景吧 应用场景就是通过关键…

GaussDB技术解读系列:高级压缩之OLTP表压缩

8月16日,第14届中国数据库技术大会(DTCC2023)在北京国际会议中心顺利举行。在GaussDB“五高两易”核心技术,给世界一个更优选择的专场,华为云数据库GaussDB首席架构师冯柯对华为云GaussDB数据库的高级压缩技术进行了详…

centos7搭建apache作为文件站后,其他人无法访问解决办法

在公司内网的一个虚拟机上搭建了httpsd服务,准备作为内部小伙伴们的文件站,但是搭建好之后发现别的小伙伴是无法访问我机器的。 于是寻找一下原因,排查步骤如下: 1.netstat -lnp 和 ps aux 先看下端口和 服务情况 发现均正常 2.…

淘宝商品数据采集(如何快速获取淘宝商品信息),淘宝API接口申请指南

淘宝作为国内的电商平台,拥有海量的商品信息。对于想要进行淘宝商品数据采集的人来说,如何快速获取淘宝商品信息是一个重要的问题。本文将介绍一些快速获取淘宝商品信息的方法。 1. 使用淘宝开放平台PI 淘宝开放平台提供了多种PI接口,可以通…

【微服务部署】01-Kubernetes部署流程

文章目录 部署1. Kubernetes是什么2. Kubernetes的优势3. 环境搭建4. 应用部署 部署 1. Kubernetes是什么 Kubernetes是一个用于自动部署、扩展和管理容器化应用程序的开源系统 2. Kubernetes的优势 自动化容器部署资源管理与容器调度服务注册发现与负载均衡内置配置与秘钥…

【java】【springboot】【idea】springboot项目pom.xml 灰色下划线

解决方案: 这里我们找到了原因,就是因为选择了Ignored Files导致pom.xml文件被设置在maven忽略文件清单中,所以我们将打勾的选项取消,点击Apply,然后点击OK

一文解析:共享WiFi项目到底怎么样呢?

大家都知道,现代社会已经离不开互联网的便利,而WiFi的普及更是提升了人们的生活质量和工作效率。然而,面对庞大的用户群体和不断增长的网络需求,无论人们到哪都是习惯性的连接上wifi。而共享WiFi的出现,正是满足了大众…

Linux基础(一)

1.操作系统概念 人与计算机交流的中介 管理和控制计算机中硬件和软件资源 处于上层应用程序和底层硬件之间的软件平台 2.操作系统组成 内核:直接控制管理硬件 内核直接识别计算机二进制语言 解释器:把c c java python等语言解释成二进制&#xff…