Golang基础语法(二)

七、数组和切片

数组:类型相同的元素集合,Go不允许数组中混合使用不同类型的元素。

声明:

1.var a[3]int     a[0]=1    a[1]=2    a[2]=3     //声明一个长度为3的int型数组,并依次复制,不赋值默认值为0

2.a:=[3]int{1,2,3}        //速记声明方式

3.a:=[…]int{1,2,3}        //用…忽略数组长度,编译器自动推导

#数组是值类型,当数组变量被赋值时,获得原数组的拷贝,新数组改变不会影响原数组,同样作为参数传递给函数时,函数获得数组的拷贝。

#用len()获取数组长度

#用for range遍历数组,range返回数组的索引和对应的值

#多维数组就是将一维数组的值变成一个新的数组,同样的可以创建三维四维数组

切片:切片是对数组的抽象,解决了数组长度不可变的问题,切片更灵活方便。

声明:

1.var slicel []type        //未指定大小的数组就是一个切片

2.var slicel []type=make([]type,len)    //slicel:=make([]type,len)    make函数用来给切片开辟空间,参数一是切片类型,参数二是长度,参数三是切片容量

初始化切片:

1.s:=[]int{1,2,3}        //直接初始化

2.s:=arr[:]            //对arr的全引用

3.s:=arr[start:end]        //将arr中从下标start到end-1的元素引用

4.s:=arr[start:]        //从start下标到最后一个

5.s:=arr[:end]          //从第一个到end-1下标

修改切片:

1.追加元素:s =append(s []T,x1,x2,x3…)

2.追加切片:s=append(s,t…)

3.删除切片:s=append(s[:i],s[i+1:])        //相当于截取

八、Map

Map:Go中的内置类型,将键与值绑定到一起,通过键获取对应的值。

创建:m:=make(map[KeyType]ValueType)    //如m:=make(map[string]int),键是string,值是int型

#map的0值为nil,试图给一个nil map添加元素会报错,因此map必须通过make初始化

#map插入元素与数组相似

/*       M:=make(map[string]int)

M[“one”]=1

M[“two”]=2

*/

#访问map与法为:map[key],如果一个键不存在返回0

#检验一个键是否存在map中,用value,ok:=map[key],如果OK是true,则存在,value被赋予对应的值

#range用于遍历map中的所有元素,map是无序的,所以每次遍历顺序不一定一致。

#delete(map, key)用于删除map中的key

#用len获取map大小

#map是引用类型

#比较两个map不能用==,只能依次比较里面的元素是否相等

九、变参函数

变参函数:可以接受可变数量的参数的函数,如果最后一个参数由…T表示,则表示该函数可以接受任意数量的T类型参数。只有最后一个参数才能指定为可变参数。

创建一个变参函数:func find(num int,nums …int){    }

十、字符串

在Go中字符串是byte数组,用””来创建字符串。

#一个英文字符占一个字节(8位),一个汉字占三个字节(24位)

#rune表示一个unicode码点,用rune可以原样打印出字符串不会出现乱码

#utf8包提供func RuneCountInString(s string)(n int)来获取字符串的长度,返回rune的数量,即unicode码数量,len返回的是byte的个数,这是两者的区别

#字符串在Go中是不可变的,一旦创建无法改变,要改变字符串需要将其转换为rune切片,修改切片的内容,再将切片转为字符串

十一、指针

指针:存储内存地址的变量叫指针变量。

声明方法:var var_name  *var_type

#取址符为&,与之相反的是*,表示解引用,读取指针指向内存地址的内容。

#指针的空值为nil,里面没有指向任何地址,不同于野指针,野指针指向的是未知内存。

#Go不支持指针运算

#虽然可以通过将数组的指针作为参数传给函数,但是一般通过切片来完成,切片相对数组更灵活。

#二级指针,指向指针的指针,var ptr **int为指向一个指向整型指针的指针,访问二级指针需要两个*号。

十二、结构体

结构体:用户自定义的类型,表示若干字段的集合。

声明一个结构体:

Type Employee struct{

name string

age int

}

实例化的三种方式:

1.    var emp1 Employee

emp1.name=“zhangsan”

emp1.age=10

2.    emp2:=Employee{

name:”zhangsan”

age:20

}

3.    emp3:=Employee{“zhangsan”,30}

#当定义一个结构体变量没有赋予初始值时,则为各类型的0值

#访问结构体中的某个字段用.操作,如emp1.name

#结构体指针,可以指向结构体的指针

emp8:=&Employee{“张三”,”20}

emp8是一个指向结构体的指针,访问结构体字段可以用*emp8.name,也可以用emp8.name代替。

#结构体可以只定义类型而不指定字段名字,这种字段叫匿名字段

Type person struct{

String

Int

}

虽然没有字段名字,但是匿名字段的默认名字为类型名,即上面的结构体有string和int两个字段

#结构体的字段是结构体,这种结构体叫嵌套结构体。

Type Person struct{

name string

age int

address Address

}

Type Address struct{

city,state string

}

#字段提阶:如果结构体中的匿名字段也是一个结构体,那么这个匿名结构体字段成为提阶字段,可以从外部结构体直接访问匿名结构体的字段。

type Person struct{

name string

age int

Address

}

提阶字段city和state可以通过p.city和c.state访问

#如果结构体的名称大写字母开头,则在其他包可以访问,同样的,如果字段大写字母开头 ,也可以被其他包访问。

#结构体是值类型。如果字段可以比较,则结构体可以比较,所有的非空字段相等则认为两个结构体变量相等。如果包含一个不可比较类型的字段,则不可比较。

猜你喜欢

转载自www.cnblogs.com/lengshan023/p/11075437.html
今日推荐