go数据结构整理

初始化基本一样,不同点需要注意,make使用,nil变量的访问

array

初始化:

  1. 57 //修改元素值函数,指针版本和副本版本,指针版会修改原值
  2. 58 func modify(arr [3]int, i int, v int) {
  3. 59 //func modify(arr *[3]int, i int, v int) {
  4. 60 arr[i] = v
  5. 61 }
  6. 62
  7. 63 func main() {
  8. 64 var v [2]int //默认初始化为0
  9. 65 v1 := [2]int{} //默认初始化为0
  10. 66 v2 := [...]int{} //根据初始化列表决定元素个数,元素个数为0
  11. 67 v3 := [3]int{2: 99} //指定索引初始化
  12. 68
  13. 69 fmt.Println(v, v1, v2, v3)
  14. 70 }

slice

初始化:

  1. 71 //切片函数参数版本
  2. 72 func modify(arr []int, i int, v int) {
  3. 73 arr[i] = v
  4. 74 }
  5. 75
  6. 76 func main() {
  7. 77 //和数组区别在于是否指定元素个数,和数组一样都是有长度的,所有随机访问时小心越界
  8. 78 var v []int //v == nil,nil值切片没有底层数组
  9. 79 vv := []int(nil) //vv == nil,nil值切片没有底层数组
  10. 80
  11. 81 v0 := []int{} //v != nil,nil切片和0长度切片行为一致,函数会等同对待
  12. 82 v1 := []int{1, 2}
  13. 83
  14. 84 var arr [3]int
  15. 85 v2 := arr[:]
  16. 86 v3 := arr[2:]
  17. 87
  18. 88 v3 = v1
  19. 89 modify(v3, 0, 111)
  20. 90 v2 = nil
  21. 91
  22. 92 v4 := make([]int, 3, 6) //若不指定cap,则和len一致
  23. 93
  24. 94 //v5 := make([]int, 4)
  25. 95 //v5 = v4[4:] //panic:slice bounds out of range,v4超过了len()
  26. 96 v4 = push(v4, 123)
  27. 97 v4 = push(v4, 123)
  28. 98 v4 = push(v4, 123)
  29. 99 v4 = push(v4, 123)
  30. 100
  31. 101 fmt.Println(v == nil, vv == nil, v0 == nil, v1, v2 == nil, v3, cap(v4), len(v4), v4)
  32. 102
  33. 103 }

数组可以用==进行比较,切片编译错误

append简单实现:

  1. 45 func push(s []int, v int) []int {
  2. 46 var tmp_s []int
  3. 47 if len(s) < cap(s) {
  4. 48 tmp_s = s[:(len(s) + 1)]
  5. 49 } else {
  6. 50 tmp_s = make([]int, len(s)+1, 2*len(s))
  7. 51 copy(tmp_s, s)
  8. 52 }
  9. 53
  10. 54 tmp_s[len(s)] = v
  11. 55
  12. 56 return tmp_s
  13. 57 }

copy函数,按照src,dst最小长度进行底层数组数据拷贝

 

appen使用:

  1. 105 v5 := make([]int, 2, 6)
  2. 106 v5 = append(v5, 1, 2)
  3. 107 v5 = append(v5, v4...)

append变长简单实现:

  1. 76 func push_s(s []int, v ...int) []int {
  2. 77 var tmp = make([]int, len(s)+len(v))
  3. 78 copy(tmp, s)
  4. 79 copy(tmp[len(s):], v)
  5. 80
  6. 81 return tmp
  7. 82 }

slice内存技巧:

不用分配新空间,在原slice上修改

清理0数据

  1. 84 func RemoveInvalid2(s []int) []int {
  2. 85 i := 0
  3. 86 for _, v := range s {
  4. 87 if v != 0 {
  5. 88 s[i] = v
  6. 89 i++
  7. 90 }
  8. 91 }
  9. 92
  10. 93 return s[:i]
  11. 94 }
  12. 95
  13. 96 func RemoveInvalid(s []int) []int {
  14. 97 s_tmp := s[:0]
  15. 98 for _, v := range s {
  16. 99 if v != 0 {
  17. 100 s_tmp = append(s_tmp, v)
  18. 101 }
  19. 102 }
  20. 103
  21. 104 return s_tmp
  22. 105 }
  1. 107 func RemoveIndex(s []int, i int) []int {
  2. 108 if i >= len(s) {
  3. 109 return s
  4. 110 }
  5. 111 copy(s[i:], s[i+1:])
  6. 112 return s[:len(s)-1]
  7. 113 }
  8. 114
  9. 115 func Reverse(s []int) []int {
  10. 116 if len(s) < 2 {
  11. 117 return s
  12. 118 }
  13. 119 for i := range s {
  14. 120 if i >= (len(s) - i - 1) {
  15. 121 return s
  16. 122 }
  17. 123 s[i], s[len(s)-i-1] = s[len(s)-i-1], s[i]
  18. 124 }
  19. 125 return s
  20. 126 }

我们也看到了slice作为函数参数的使用,同样map也是会作为引用来使用的,使用时要注意slice和map内部变化,防止得不到想要的结果,所以我一般会在函数返回后进行赋值

map

  1. 128 func insert(m map[int]string, i int, s string) map[int]string {
  2. 129 m[i] = s
  3. 130 return m
  4. 131 }
  5. 132
  6. 133 func main() {
  7. 134 var m map[int]string
  8. 135 m1 := map[int]string{2: "ss", 5: "aa"}
  9. 136 delete(m1, 5)
  10. 137
  11. 138 m2 := make(map[int]string)
  12. 139 m3 := map[int]string{}
  13. 140 m3 = insert(m3, 2, "aaaaaaa")
  14. 141
  15. 142 m4 := make(map[int]map[string]bool)
  16. 143 fmt.Println(m == nil, m1, m2, m3, m4)
  17. 144 }

注意:key必须是可比较的类型,如字符串,数组(可比较的字段),结构体(可比较的字段)

slice不能比较,但可以转换成字符串再存储为key



struct

  1. 149 type Point struct {
  2. 150 x, y float64
  3. 151 }
  4. 152
  5. 158
  6. 159 type line struct {
  7. 160 pt []Point
  8. 161 }
  9. 163 func main() {
  10. 164 /*
  11. 165 l := []struct {
  12. 166 pt []Point
  13. 167 cnt int
  14. 168 }{{
  15. 169 pt: []Point{{
  16. 170 x: 1,
  17. 171 y: 2,
  18. 172 }, {
  19. 173 x: 3,
  20. 174 y: 4,
  21. 175 }},
  22. 176 cnt: 2,
  23. 177 }}
  24. 178 */
  25. 179
  26. 180 var pt Point
  27. 181 pt.x = 1
  28. 182 pt.y = 2
  29. 183
  30. 184 pt1 := Point{1, 2} //这种初始化方式不推荐,建议用下方
  31. 185 pt2 := Point{x: 1, y: 2}
  32. 186
  33. 187 l := []line{}
  34. 188
  35. 189 var l1 line
  36. 190 //l1 := line{}
  37. 191
  38. 192 l = append(l, l1)
  39. 193 l[0].pt = append(l[0].pt, Point{11, 22})
  40. 194 fmt.Println(pt, pt1, pt2, l, l1)
  41. 195 }

结构方法使用

  1. 153 //func (p *Point) Distance(target *Point) float64 {
  2. 154 func (p Point) Distance(target *Point) float64 {
  3. 154 p.x = 0.1
  4. 155 target.x = 0.2
  5. 156 return 0.0
  6. 157 }
  7. 197 pt.Distance(&pt1)
  8. 198 fmt.Println(pt, pt1)

改变函数调用方类型,试试结果的不同

go会根据调用方类型隐式转换,所以197行可以正确运行

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

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

相关文章

配置BGP

配置BGP<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />一、 实验目的:配置BGP协议,实现两个isp之间的通信二、 实验拓扑结构图三、实验步骤1. 基本接口配置(略) 2. 配置bgp协议isp<?xml:namespace prefix …

临时表和内存表的区别

看到很多朋友对这些概念有些混淆&#xff0c;我来发表下我自己的观点。内存表&#xff1a;1. 参数控制&#xff1a;max_heap_table_size2. 到达上线后报错。3. 表定义保存在磁盘上&#xff0c;数据和索引保存在内存里面。4. 不能包含TEXT,BLOB等字段。临时表&#xff1a;1. 参数…

哈工大C语言公开课练兵编程(二)

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/juejing2271/article/details/79854773 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --…

MyXls初级教程

这些天使用MyXls导出Excel报表&#xff08;因为Apose.Cells要收费&#xff09;。感觉MyXls虽然功能远没有Cells强大&#xff0c;但是胜在开源、免费而且性能稳定可靠。用作出一般情况下的报表。足矣&#xff01; 记下几个初级使用方法&#xff0c;希望能够给初入门的人一点帮助…

竞赛ACM,究竟能为你的职场加分多少?

注&#xff1a;ACM 竞赛全称为 ACM 国际大学生程序设计竞赛&#xff0c;英文全称&#xff1a;ACM International Collegiate Programming Contest&#xff0c;简称 ACM-ICPC 或 ICPC &#xff09;。因为大家习惯简称为 ACM&#xff0c;文章中出现的 ACM 若无额外备注&#xff0…

话里话外:家族化管理模式和职业化管理模式孰优孰劣

中国改革开放三十年&#xff0c;在民营企业中有大批老板现今五六十岁&#xff0c;现在或未来都要考虑为企业选好接班人的问题。他们该如何传位呢&#xff1f;“世袭制”古已有之&#xff0c;“能者居之”亦古已有之。中国有句俗话“穷人家的孩子早当家”&#xff0c;如果这句话…

蓝桥杯 - 历届试题 - 日期问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_33531813/article/details/79516258 </div><div id"content_views" class"markdown_views"><!-- flowchart 箭头图标 勿删 --…

分享WCF文件传输---WCFFileTransfer

前几天分享了分享了WCF聊天程序--WCFChat &#xff0c;本文和大家一起分享利用WCF实现文件的传输。程序运行效果&#xff1a;接收文件端&#xff1a;发送文件端&#xff1a;连接WCF服务&#xff0c;选择要传输的文件文件传输成功&#xff1a;我们会在保存文件的默认路径&#x…

蓝桥杯 日期问题

版权声明&#xff1a;本文为作者原创文章&#xff0c;转载请注明出处。 https://blog.csdn.net/Glasier/article/details/79630724 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f579…

linux 命令速查手册之十

今天粘贴的是linux命令之 用户管理8.1 adduser功能说明&#xff1a;新增用户帐号。语  法&#xff1a;adduser补充说明&#xff1a;在Slackware中&#xff0c;adduser指令是个script程序&#xff0c;利用交谈的方式取得输入的用户帐号资料&#xff0c;然后再交由真正建立帐号…

字符串的模式匹配--BF算法KMP算法

BF算法是基于主串指针回溯&#xff0c;重新与子串进行逐字符进行比较&#xff0c;主串为S什么要进行回溯呢&#xff0c;原因在于模式P中存在相同的字符或者说由字符&#xff08;串&#xff09;存在重复&#xff08;模式的部分匹配性质&#xff09;&#xff0c;设想如果模式P中字…

用SQL Server 监控 OS Server 的Task Management信息

用SQL Server 监控 OS Server 的Task Management信息 --原文来自于http://www.databasejournal.com/features/mssql/article.php/3562586/Monitor-CPU-Usage-of-All-Running-Processes---Part-II.htm 一&#xff1a; 监控程序部分 1. 在C 盘创一个文件夹&#xff1a;如 C…

匈牙利算法——最大匹配问题详解

2017年中兴提前批校招&#xff0c;就考了一题匈牙利算法。 匈牙利算法是由匈牙利数学家Edmonds于1965年提出&#xff0c;因而得名。匈牙利算法是基于Hall定理中充分性证明的思想&#xff0c;它是部图匹配最常见的算法&#xff0c;该算法的核心就是寻找增广路径&#xff0c;它是…

字符串匹配之KMP---全力解析

PS&#xff1a;文章是转载的 下方的微信公号不是我的 是原作者的。附上原文链接&#xff1a;字符串匹配之KMP jeliy王的博客 近日&#xff0c;一同学面试被问到字符串匹配算法&#xff0c;结果由于他使用了暴力法&#xff0c;直接就跪了(现在想想这样的面试官真的是不合格的&am…

VS2005中,access对只读目录的属性判断不准确

只读目录&#xff0c;C:/>attrib A S H R testdirC:/>attrib testdirA SHR C:/testdir (1)VC6.0的执行结果&#xff1a;***********test stat***********************file [c:/testdir] exists!file [c:/testdir] is directory!file [c:/testdir] can be read!file …

两种方法求解逆序对

逆序对定义&#xff1a;对于一个包含N个非负整数的数组A[1..n]&#xff0c;如果有i < j&#xff0c;且A[ i ]>A[ j ]&#xff0c;则称(A[ i] ,A[ j] )为数组A中的一个逆序对。 常见的两种方法求解逆序对&#xff1a;1.穷举法&#xff08;暴力求解&#xff09;&#xff0c…

页面延时跳转

Response.Write("<script>window.setTimeout(\"window.locationtest.aspx\",5000);</script>");实现延时5秒后跳转

电脑老是提示虚拟内存不足的原因及解决办法

首先普及一下何为虚拟内存 以及 虚拟内存的定义 Windows操作系统用虚拟内存来动态管理运行时的交换文件。为了提供比实际物理内存还多的内存容量以供使用&#xff0c;windows操作系统占用了硬盘上的一部分空间作为虚拟内存。当CPU有需求时&#xff0c;首先会读取内存中的资料。…

用Dreamweaver实现ASP动态网站建设【8】

八、制作删除数据记录页 用上述学过的方法在Index.asp上创建“删除”连接。新建网页命名为delete.asp&#xff0c;并打开它&#xff0c;在其上创建一个七行二列的表格&#xff0c;并在左边的表格上填写相应的字段名&#xff0c;然后给网页绑定一个记录集&#xff0c;并对其字段…

你的输入安全吗?

看看这个录像你就知道了&#xff0c;http://www.vimeo.com/2007855?pgembed&sec2007855至少有四种以上的方法来获取键盘的输入&#xff0c;老外就是牛逼&#xff0c;通过信号监听和对信号的反编译&#xff0c;直接还原用户的输入&#xff0c;不过离真正的应用还有一段距离…