# Go学习-Day5

news/2024/4/24 4:09:40/

文章目录

    • 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.ppmy.cn/news/1057919.html

相关文章

网站是如何识别网络爬虫的?

在爬取数据时,你常常会遇到各种网站的反爬机制。网站是如何检测和拦截网络爬虫的呢?本文将为你揭秘网站使用的几种常见的反爬手段,并为你提供一些解决方案,助你越过反爬壁垒,提升你的实际操作效率。 一、Cookie检测 …

守护进程(精灵进程)

目录 前言 1.如何理解前台进程和后台进程 2.守护进程的概念 3.为什么会存在守护进程 4.如何实现守护进程 5.测试 总结 前言 今天我们要介绍的是关于守护进程如何实现,可能有小伙伴第一次听到守护进程这个概念,感觉很懵,知道进程的概念&…

C++编程中的六种内存顺序模型

文章目录 前言为什么要设计内存顺序模型常见的内存顺序模型总结 前言 程序员真是一个活到老学到老的职业,一天不学习就会掉队,『内存顺序模型』对于我来说就是一个新的世界,虽然之前写过多线程的服务器,也处理过死锁和竞态条件等…

C++day4(拷贝赋值函数、匿名对象、友元、常成员函数和常对象、运算符重载)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.day3作业订正&#xff1a;设计一个Per类&#xff0c;类中包含私有成员&#xff1a;姓名、年龄、指针成员身高... #include <iostream>using namespace std;//封装人 类 class Person { private:string name;…

渗透测试漏洞原理之---【SQL注入】

文章目录 1、SQL注入原理1.1、SQL注入原理1.2、SQL注入危害1.3、SQL注入分类1.4、SQL注入漏洞挖掘1.4.1、注入点判断1.4.2、主要关注的问题1.4.3、sql-lib靶场第一关注入点 1.5、知识补充 2、SQL注入基本手法2.1、联合查询判断注入类型判断列数判断显示位数据库中的敏感信息获取…

【算法题】2826. 将三个组排序

题目&#xff1a; 给你一个下标从 0 开始长度为 n 的整数数组 nums 。 从 0 到 n - 1 的数字被分为编号从 1 到 3 的三个组&#xff0c;数字 i 属于组 nums[i] 。注意&#xff0c;有的组可能是 空的 。 你可以执行以下操作任意次&#xff1a; 选择数字 x 并改变它的组。更正…

Python学习 -- 类的多态

在面向对象编程中&#xff0c;多态性是一项强大的特性&#xff0c;它允许不同的对象对同一方法产生不同的行为。Python作为一门面向对象的编程语言&#xff0c;也支持多态性。本篇博客将深入探讨Python中的类多态性&#xff0c;通过详细的代码案例来展示其灵活性和可扩展性。 …

云服务器 宝塔(每次更新)

su root 输入密码 使用 root 权限 /etc/init.d/bt default 获取宝塔登录 位置和账号密码。进入宝塔 删除数据库 删除php前端站点 删除PM2后端项目 前端更改完配置打包dist文件 后端更改完配置项目打包 数据库结构导出 导入数据库 配置 PM2 后端 安装依赖

事务特性 - 达梦数据库

达梦数据库事务特性 1 事务特性1.1 原子性1.2 一致性1.3 隔离性1.4 持久性 1 事务特性 事务必须具备什么属性才是一个有效的事务呢&#xff1f;一个逻辑工作单元必须表现出四种属性&#xff0c;即原子性、一致性、隔离性和持久性&#xff0c;这样才能成为一个有效的事务。DM 数…

gPRC与SpringBoot整合教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

C语言:运算符优先级

一、优先级&#xff08;常使用的运算符&#xff09; 见表格 二、注意 总体原则&#xff1a;算术运算符 > 关系运算符 > 逻辑运算符 > 赋值运算符 同一级别下的运算符的运算次序由表达式的结合方向决定 运算符注释级别( )圆括号1[ ]数组下标1后置后置2后置--后置--2前置…

2023-08-24力扣每日一题

链接&#xff1a; 1267. 统计参与通信的服务器 题意&#xff1a; 同行同列可以发生通信&#xff0c;求能发生通信的机器数量 解&#xff1a; 标记每行/每列的机器个数即可 实际代码&#xff1a; #include<bits/stdc.h> using namespace std; class Solution { pub…

【归并排序】

归并排序 #include<iostream> using namespace std; const int N 100000 11;int n; int q[N]; int tmp[N];void merge_sort(int q[],int l,int r){if(l>r) return ;int mid (lr)>>1;merge_sort(q,l,mid);merge_sort(q,mid1,r);int k 0;int i l;int j …

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】 1、前言2、实验环境3、自我总结&#xff08;1&#xff09;文件的编写&#xff08;2&#xff09;信号与槽的新理解&#xff08;3&#xff09;线程数据的传递 4、移植步骤第一步&#xff1a;添加新文…

【Vue框架】 router和route是什么关系

前言 之前没太注意&#xff0c;写着写着突然发现它们貌似不太一样&#xff0c;记录以下&#xff0c;回顾的看总结就好。 1、总结✨ route&#xff1a;当前激活路由的对象&#xff0c;用于访问和操作当前路由的信息 router&#xff1a;管理多个route的对象&#xff0c;整个应…

Vue项目打包优化

在Vue开发过程中&#xff0c;脚手架是一个辅助开发的工具&#xff0c;而真正参与上线的是打包后的源代码。打包的过程包括将多个文件压缩合并成一个文件、进行语法降级以及将Less、Sass、TypeScript等语法解析为CSS等操作。 打包后的源码可以生成一个可直接在浏览器中运行的网…

[Go版]算法通关村第十四关白银——堆能高效解决的经典问题

目录 题目&#xff1a;在数组中找第K大的元素思路分析&#xff1a;复杂度&#xff1a;Go代码 题目&#xff1a;堆排序原理思路分析&#xff1a;复杂度&#xff1a;Go代码 题目&#xff1a;合并K个排序链表思路分析&#xff1a;复杂度&#xff1a;Go代码 题目&#xff1a;在数组…

『论文精读』FastViT(ICCV 2023,Apple开源)论文解读

『论文精读』FastViT(ICCV 2023&#xff0c;Apple开源)论文解读 文章目录 一. FastViT简介二. 模型架构2.1. Stage 的内部架构2.2. Stem 的结构2.3. Patch Embedding 的架构2.4. 位置编码 三. 参考文献 论文下载链接&#xff1a;https://arxiv.org/pdf/2303.14189.pdf论文代码…

设计模式 07 桥接模式

桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型模式 概述 桥接模式是将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。它是一种对象结构型模式&#xff0c;又称为柄体&#xff08;Handle and Body&#xff09;模式或接口&#xff08;Interface&…

Spring复习:(58)<context:annotation-config/>的作用

引入如下的BeanPostProcessor • ConfigurationClassPostProcessor • AutowiredAnnotationBeanPostProcessor • CommonAnnotationBeanPostProcessor • PersistenceAnnotationBeanPostProcessor • EventListenerMethodProcessor如果xml文件配置了bean中使用了Autowired注解…