- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
前面的文章介绍了Go的一些基本类型,本文开始涉及Go的一些容器类型,它们都是可以包含多个元素的数据结构,如数组、切片、map
数组是具有相同类型且长度固定的一组元素集合,定义的格式:var 数组名 [数组长度]数组元素类型
,下面声明一个长度为5的int型数组arr
var arr [5]int
len(arr)
var arr = [5]int{1, 2, 3, 4, 5}
a := [3]int{1, 2, 3}
还可以在初始化时仅初始化指定元素
b := [3]int{1 : 2, 2 : 3} //初始化索引为1的值为2,索引为2的值为3
...
代替,编译器会自动生成满足最低长度要求的数组c := [...]int{4 : 1} //因为我们指定了索引为4的值为1,因此数值至少包含5个元素,这里将生成长度为5的数组
for
循环来遍历操作数组var arr [5]int
for i := 0; i < len(arr); i++ {
arr[i] = i * 2
}
for i, v := range arr {
fmt.Println("index: ", i, "value: ", v)
}
new
来创建数组,不过它返回的是指向该数组的指针d := new([4]int)
fmt.Println(d) //&[0,0,0,0]
fmt.Println(*d) //[0,0,0,0]
注意区分指向数组的指针和指针数组
e := [5]int{1, 2, 3, 4, 5}
var p *[5]int = &e //p为指向数组e的指针 &[1,2,3,4,5]
x, y := 1, 2
z := [2]*int{&x,&y} //z是一个指针数组
h := [2][3]int{
{1, 1, 1},
{2, 2, 2}
}
==
或!=
来比较f := [2]int{1, 2}
g := [2]int{1, 2}
fmt.Println(f == g) //true
切片(slice)是对某个数组的一段连续片段的引用(该数组我们称为相关数组,该片段可以是整个数组,也可以是数组中的某一段),因此切片是一个引用类型。切片底层实现是数组,它与数组的关系如下图:
多个slice可以指向同一个底层相关数组,此时其中一个值改变会影响全部的值
切片是一个可变长的数组,它的长度可以动态修改,可以用len()
来获取切片的长度。切片还有另外一个属性容量,表示切片可以达到的最大长度,可以用cap()
来获取。切片的容量等于切片的长度+相关数组中在切片之后剩下的的长度。所以切片的长度小于等于切片的容量。
切片的容量是预先分配的,如果在运行的过程中,切片的长度超过了原来分配的容量,则会重新分配一个空间更大的数组,然后将值都拷贝过去
切片的声明格式:var 切片名 []元素类型
,这里不需要指定长度,如果是数组则必须指定长度或者用...
替代
切片可以通过底层相关数组切取,也可以用make
直接创建,还可以通过已有的切片来生成
通过数组生成
arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
s1 := arr[2:5] //切取数组arr索引从2~4这一段(即[3,4,5]),注意索引值不包括5
s2 := arr[:] //切片为整个arr数组
s3 := arr[5:] //切取从索引5开始到末尾,即[6,7,8,9,10]
make
创建make([]type, len, cap)
,其中cap
可以省略,省略则默认和len
相同s4 := make([]int, 3, 20)
s5 := make([]int, 3)
sa := []int{1, 2, 3, 4, 5}
sb := sa[1:4] //[2,3,4],len:3,cap:4
sc := sb[1:4] //[3,4,5],len:3,cap:3
需要注意的是,新的切片的索引不能超过原切片的容量,否则会引发编译错误,而不是重新分配数组
append
函数,用法为append(被追加元素的slice, 追加的元素...)
s1 := make([]int, 3, 6)
s1 = append(s1, 1, 2, 3) //[0,0,0,1,2,3],还是返回原来的slice (没有超过原来cap)
s1 = append(s1, 1, 2, 3) //[0,0,0,1,2,3,1,2,3],返回的是一个新的slice(已经超过了cap,重新分配底层数组)
注意,如果追加后的长度未超过原slice的容量,则返回原始的slice,如果超过了,则重新分配空间更大的数组并拷贝原始数据
copy
函数将一个切片拷贝到另外一个切片中,用法copy(目标slice, 被拷贝的slice)
sc1 := []int{1, 2, 3, 4, 5}
sc2 := []int{6, 7, 8}
copy(sc1, sc2)
fmt.Println(sc1) //[6 7 8 4 5]
copy(sc2,sc1)
fmt.Println(sc2) //[6,7,8]
copy(sc2[0:2], sc1[3:5]) //指定具体位置
fmt.Println(sc2) //[4 5 8]
Map是Go里面的键值对集合,由key-value对组成,给定key,可以快速定位到对应的value。也被称为字典、哈希表等
==
或者!=
操作符比较的类型,比如string
,int
、float
等,不能是函数、map、切片;value可以是任意类型var map变量名 map[key类型]vlaue类型
var m map[int]string //声明
m = map[int]string{1:"a", 2:"b"} //初始化
特别注意,map必须要初始化才能使用,即如果用上面这种方式,必须要有初始化的语句map1 = map[keyType]ValueType{}
,否则将报错。当然如果觉得太繁杂,可以使用下面的make
语句来替代,更加简洁(主要是因为使用前需要先分配好内存空间给map,使用初始化语句或者make
语句才能实现空间的分配)
make
来创建var m1 map[int]string = make(map[int]string)
m2 := make(map[int]string) //简要写法
m1[1] = "ok" //插入 (1 : ok)的key-value
m2[1] = "good"
make
创建还可以指定容量,make(map[key类型]value类型,cap)
,cap
为容量,可以省略。超出容量会自动扩容,但为了性能还是尽量提供一个大概的初始值。
a:=m[1]
(获取key为1的value)m[1]="ok"
map[key]
还有另外一种用法:value,isPresent = map[key]
,即返回两个值,第二个值isPresent
是布尔类型,如果该key存在,该值为true
,且value
为该key对应的值;如果key不存在,则isPresent
为false
,且value
为空值。if value, ok := map1[key1];ok{
fmt.Println(value)
}
delete(map1, key1)
for-range
对map进行遍历map1 := make(map[int]string)
map1[1] = "a"
map1[2] = "b"
map1[3] = "c"
for key, value := range map1 {
fmt.Println(key,value)
}
如果指向获取key或者value,可以这么使用
for key := range map1 {
fmt.Println(key)
}
for _, vlaue := range map1 {
fmt.Println(value)
}
需要注意的是,for
中获得的key和value值都是副本,直接对这两个值进行修改并不会对原来的map有影响。需要用map[key]
才能真正改变map中的值
make
,第一次分配切片,第二次分配切片中每个map元素sm := make([]map[int]string, 5)
for i := range sm {
sm[i] = make(map[int]string,1)
sm[i][1]="ok"
}
make
之后才能使用(初始化分配空间)var m2 map[int]map[int]string
m2 = make(map[int]map[int]string)
m2[1] = make(map[int]string) //value中嵌套的map也需要进行初始化
m2[1][1] = "ok1"
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
介绍篇 什么是MiniApis? MiniApis的特点和优势 MiniApis的应用场景 环境搭建 系统要求 安装MiniApis 配置开发环境 基础概念 MiniApis架构概述
我正在从“JavaScript 圣经”一书中学习 javascript,但我遇到了一些困难。我试图理解这段代码: function checkIt(evt) { evt = (evt) ? e
package com.fastone.www.javademo.stringintern; /** * * String.intern()是一个Native方法, * 它的作用是:如果字
您会推荐哪些资源来学习 AppleScript。我使用具有 Objective-C 背景的传统 C/C++。 我也在寻找有关如何更好地开发和从脚本编辑器获取更快文档的技巧。示例提示是“查找要编写脚本的
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
关闭。这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,以便堆栈溢出为 on-topic。 6年前关闭。 Improve this
我是塞内加尔的阿里。我今年60岁(也许这是我真正的问题-笑脸!!!)。 我正在学习Flutter和Dart。今天,我想使用给定数据模型的列表(它的名称是Mortalite,请参见下面的代码)。 我尝试
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 9年前关闭。 Improve this que
学习 Cappuccino 的最佳来源是什么?我从事“传统”网络开发,但我对这个新框架非常感兴趣。请注意,我对 Objective-C 毫无了解。 最佳答案 如上所述,该网站是一个好地方,但还有一些其
我正在学习如何使用 hashMap,有人可以检查我编写的这段代码并告诉我它是否正确吗?这个想法是有一个在公司工作的员工列表,我想从 hashMap 添加和删除员工。 public class Staf
我正在尝试将 jQuery 与 CoffeScript 一起使用。我按照博客中的说明操作,指示使用 $ -> 或 jQuery -> 而不是 .ready() 。我玩了一下代码,但我似乎无法理解我出错
还在学习,还有很多问题,所以这里有一些。我正在进行 javascript -> PHP 转换,并希望确保这些做法是正确的。是$dailyparams->$calories = $calories;一条
我目前正在学习 SQL,以便从我们的 Magento 数据库制作一个简单的 RFM 报告,我目前可以通过导出两个查询并将它们粘贴到 Excel 模板中来完成此操作,我想摆脱 Excel 模板。 我认为
我知道我很可能会因为这个问题而受到抨击,但没有人问,我求助于你。这是否是一个正确的 javascript > php 转换 - 在我开始不良做法之前,我想知道这是否是解决此问题的正确方法。 JavaS
除了 Ruby-Doc 之外,哪些来源最适合获取一些示例和教程,尤其是关于 Ruby 中的 Tk/Tile?我发现自己更正常了 http://www.tutorialspoint.com/ruby/r
我只在第一次收到警告。这正常吗? >>> cv=LassoCV(cv=10).fit(x,y) C:\Python27\lib\site-packages\scikit_learn-0.14.1-py
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
我是一名优秀的程序员,十分优秀!