1:数组
所谓的数组:是指一系列同一类型数据的集合。
1.1数组定义
var a [10]int
数组定义也是通过var 关键字,后面是数组的名字a,长度是10,类型是整型。表示:数组a能够存储10个整型数字。也就是说,数组a的长度是10。
当定义完成数组a后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。
1.2数组赋值
var a[10] int 表示的范围是a[0],a[1],a[2]…….,a[9]
package main
import "fmt"
func main() {
var a [10]int
a[0]=1
a[1]=1
a[2]=1
a[3]=1
a[4]=1
a[5]=1
a[6]=1
a[7]=1
a[8]=1
a[9]=1
fmt.Println(a)
}
//输出结果
//[1 1 1 1 1 1 1 1 1 1]
1.3·数组初始化
package main
import "fmt"
func main() {
var a [10]int=[10]int{1,3,4,5,6,7,8,9,0}
fmt.Println(a)
1.4 数组冒泡排序
如何对数组中存储的数据,按照从大到小,或者从小到大进行排序?可以使用冒泡排序。
分析过程:
package main
import "fmt"
func main() {
arr:=[...]int{1,3,5,6,7,0,8,-1,-5,-6,-7,-8,0}
for i:=0;i<len(arr)-1;i++{
for j:=0;j<len(arr)-1-i;j++{
if arr[j]>arr[j+1]{
arr[j],arr[j+1]=arr[j+1],arr[j]
}
}
}
fmt.Println(arr)
}
输出结果
[-8 -7 -6 -5 -1 0 0 1 3 5 6 7 8]
1.6数组作为函数参数
package main
import "fmt"
func test(a [5]int){
a[0]=1111
fmt.Println(a)
}
func main() {
arr:=[5]int{1,3,5,6,4}
test(arr)
fmt.Println(arr)
}
输出结果
[1111 3 5 6 4]
1.7练习:
用方法来实现:有一个字符串数组: { “马龙”, “迈克尔乔丹”, “雷吉米勒”, “蒂姆邓肯”, “科比布莱恩特” },请输出最长的字符串。
package main
import "fmt"
func test(a [5]string) string{
var ma string
ma=a[0]
for i:=0;i<len(a);i++{
if len(a[i])>len(ma){
ma=a[i]
}
}
return ma
}
func main() {
arr:=[5]string{ "马龙", "迈克尔乔丹", "雷吉米勒", "蒂姆邓肯", "科比布莱恩特"}
b:=test(arr)
fmt.Println(b)
}
输出结果
科比布莱恩特
2.切片
2.1
切片:切片与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大,所以可以将切片理解成“动态数组”。
2.2切片定义方式
package main
import "fmt"
func main() {
s:=[]int{1,3,5,6,8,3,5,7}
fmt.Println(s)
}
输出结果
[1 3 5 6 8 3 5 7]
append( )函数:第一个参数表示向哪个切片追加数据,后面表示具体追加的数据。
package main
import "fmt"
func main() {
s:=[]int{}
s=append(s,3,5,7)
fmt.Println(s)
}
//输出结果
//[3 5 7]
通过make函数
package main
import "fmt"
func main() {
s:=make([]int,3,5)
fmt.Println(s)
}
//输出结果
//[0 0 0]
//借助make函数, 格式 make(切片类型, 长度, 容量)
什么是切片的长度与容量?
长度是已经初始化的空间(以上切片s初始空间默认值都是0)。容量是已经开辟的空间,包括已经初始化的空间和空闲的空间。
2.3切片截取
package main
import "fmt"
func main() {
s:=[]int{10,20,30,0,0}
slice:=s[0:3:5]
fmt.Println(slice)
}
//输出结果
//[10 20 30]
s[0:3:5]是什么意思呢?
我们可以使用s[low:high:max]来表示
第一个数(low)表示下标的起点(从该位置开始截取),如果low取值为0表示从第一个元素开始截取,也就是对应的切片s中的10
第二个数(high)表示取到哪结束,也就是下标的终点(不包含该位置),3表示取出下标是0,1,2的数据(10,20,30),不包括下标为3的数据,那么也就是说取出的数据长度是3. 可以根据公式:3-0 计算(len=high-low),也就是第二个数减去第一个数,差就是数据长度。在这里可以将长度理解成取出的数据的个数。
第三个数用来计算容量,所谓容量:是指切片目前可容纳的最多元素个数。通过公式5-0计算(cap=max-low),也就是第三个数据减去第一个数。该案例中容量为5
关于切片的截取还有其它的操作,如下所示:
2.4 copy函数的使用
在第一节中,已经给大家讲解过切片与数组很大的一个区别就是:切片的长度是不固定的,可以向已经定义的切片中追加数据。并且也给大家简单的演示过通过append的函数,在原切片的末尾添加元素。
基本语法:copy(切片1,切片2)
将第二个切片里面的元素,拷贝到第一个切片中。
package main
import "fmt"
func main() {
s:=[]int{10,20,30,0,0}
c:=[]int{6,6}
copy(s,c)
fmt.Println(s)
}
//输出结果
//[6 6 30 0 0]
倒转
package main
import "fmt"
func main() {
s:=[]int{10,20,30,0,0}
c:=[]int{6,6}
copy(c,s)
fmt.Println(c)
}
//输出结果
//[10 20]
2.5切片作为函数参数
切片也可以作为函数参数,那么与数组作为函数参数有什么区别呢?
接下来通过一个案例,演示一下切片作为函数参数。
package main
import "fmt"
func InitData(num []int){
for i:=0;i<len(num);i++{
num[i]=i
}
}
func main() {
s:=make([]int,10)
InitData(s)
for _,v:=range s {
fmt.Println(v)
}
}
//输出结果
//0
//1
//2
//3
//4
//5
//6
//7
//8
//9
通过以上案例,发现在主函数main( )中,定义了一个切片s,然后调用InitData( )函数,将切片s作为实参传递到该函数中,并在InitData( )函数中完成初始化,该函数并没有返回值,但是在主函数中直接打印切片s,发现能够输出对应的值。也就是在InitData( )函数中对形参切片num赋值,影响到了main( )函数中的切片s.
但是,大家仔细想一下,如果我们这里传递参数不是切片,而是数组,那么能否完成该操作呢?
那么我们将上面的程序,修改成以数组作为参数进行传递的形式:
package main
import "fmt"
func InitData(num [10]int){
for i:=0;i<len(num);i++{
num[i]=i
}
}
func main() {
var s [10]int
InitData(s)
for _,v:=range s {
fmt.Println(v)
}
}
//输出结果
//0
//0
//0
//0
//0
//0
//0
//0
//0
//0
发现以数组的形式作为参数,并不能完成我们的要求,所以切片作为函数实参与数组作为函数实参,进行传递时,传递的方式是不一样的。切片为地址传递,数组为值传递。