在学习完Go语言相关运算符和流程控制,以及简单的函数定义后,今天我学习了Go函数详解以及数组,切片,映像和面向对象
函数
- Go语言中是不允许函数重载的,函数重载会出现报错
- Go语言的函数中支持可变参数
- Go语言中基本数据类型和数组都默认是值传递的,在函数中修改,不会更改main函数中的值
- 以值传递方式的数据类型,如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量,从效果来看类似引用传递
- 函数也可以作为一种变量类型
函数中包的引入 当我们需要使用包下的函数时,我们应该要先导入函数对应的包,当我们想定义一个同名的函数时,在同一个文件中,我们不能够定义相同名字的函数,此时就可以用包来区分
init函数
初始化函数,可以进行一些初始化操作
匿名函数
匿名函数最常用的方式是:定义匿名函数时就直接使用,且只使用一次
闭包
闭包就是函数和它相关引用环境的组合
defer关键字
在创建函数时,我们常常需要创建资源,为了及时释放资源,可以用defer关键字
##数组
###数组定义格式为:
var 数组名 [数组大小]数据类型
###数组的遍历
1.普通for循环
2.键值循环 即利用 for range,for range结构是Go语言特有的一种的迭代结构,在许多情况下都非常有用。
for range 可以遍历数组、切片、字符串、map 及通道,for range 语法上类似于其它语言中的 foreach 语句,一般形式为:
for a, b := range coll { ... }
coll为数组,a和b是自定义用来接受for range循环后的值的变量
若是不想接收,可以用下划线来忽略。
###数组的初始化方式
数组的初始化方式有四种
`package main import "fmt" func main(){
//第一种:
var arr1 [3]int = [3]int{3,6,9}
fmt.Println(arr1)
//第二种:
var arr2 = [3]int{1,4,7}
fmt.Println(arr2)
//第三种:
var arr3 = [...]int{4,5,6,7}
fmt.Println(arr3)
//第四种:
var arr4 = [...]int{2:66,0:33,1:99,3:88}
fmt.Println(arr4)
} `
二维数组与其类似
切片
1.切片(slice)是golang中一种特有的数据类型
2.数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见。相对的切片却是随处可见的,切片是一种建立在数组类型之上的抽象,它构建在数组之上并且提供更强大的能力和便捷。
3.切片(slice)是对数组一个连续片段的引用,所以切片是一个引用类型。这个片段可以是整个数组,或者是由起始和终止索引标识的一些项的子集。需要注意的是,终止索引标识的项不包括在切片内。切片提供了一个相关数组的动态窗口。
4.代码: 切片的语法: var 切片名 []类型 = 数组的一个片段引用
映射
1.映射(map), Go语言中内置的一种类型,它将键值对相关联,我们可以通过键 key来获取对应的值 value
2.基本语法 var map变量名 map[keytype]valuetype
PS:key、value的类型:bool、数字、string、指针、channel 、还可以是只包含前面几个类型的接口、结构体、数组
PS:key通常为int 、string类型,value通常为数字(整数、浮点数)、string、map、结构体
PS:key:slice、map、function不可以
3.代码:
map的特点:
- map集合在使用前一定要make
- map的key-value是无序的
- key是不可以重复的,如果遇到重复,后一个value会替换前一个value
- value可以重复的
面向对象
Golang语言面向对象编程说明:
(1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言。所以我们说Golang支持面向对象编程特性是比较准确的。
(2)Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,你可以理解Gelang是基于struct来实现OOP特性的。
(3)Golang面向对象编程非常简洁,去掉了传统OOP语言的方法重载、构造函数和析构函数、隐藏的this指针等等
(4)Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样,比如继承:Golang没有extends 关键字,继承是通过匿名字段来实现。