GO语言笔记——函数

函数重要语法

切片的使用

  • 用make()函数来创造切片
var slice1 []type = make([]type, len)
slice1 := make([]type ,len)
  • 创建基于数组的切片
a := [5]int{1,2,3,4,5}
var b[]int = a[1:3]
b := a[1:3]
  • 切片的长度时切片元素的数量,切片的容量是从创建切片的索引开始的底层数组中元素的数量。
  • 添加元素
    • append()
  • 复制元素
    • copy()
  • append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。 但当slice中没有剩
    余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间,而原
    数组的内容将保持不变;其它引用此数组的slice则不受影响。

+++

Map的使用

  • Map是GO中的内置类型,它将一个值与一个键关联起来。可以使用相应的键检索值。

  • Map是使用hash表来实现的,所以是无序的,不能通过index来获取,而是必须通过key获取

使用map(),也可以使用make来定义map

var map_variable map[key_data_type]value_data_type
map_variable = make(map[key_data_type]value_data_type)

函数

  • 可变参
func myfunc(arg ...int){}

全局变量所有函数都是共享的

  • defer语句,会在函数执行到最后时,照逆序执行,最后该函数返回。

  • defer同样适用于一个方法的调用

  • 延迟函数的参数在执行延迟语句时被执行,而不是在执行实际的函数调用时执行。

func printA(a int){
	fmt.Println("Value of a in deferred function",a)
}
func main() {
	//nums := []int{78, 109, 2, 563, 300}
	//largest(nums)
	a := 5
	defer printA(a)
	a = 10
	fmt.Println("value of a before deferred function call",a)
}

运行结果:

value of a before deferred function call 10
Value of a in deferred function 5

多个defer例:

func main() {	
	defer printString("hello")
	fmt.Println("main中执行了。。。。")
	defer printString("world")

	a := 1
	defer fun1(a) //将a传递参数,只是暂时不执行。。
	a = 100
	defer fun1(a)
	fmt.Println(a) // 100
}
func fun1(num int){
	fmt.Println("我是fun1函数。。num:",num)
}
//练习1:利用defer语句,将一个字符串倒叙输出。


func printString(letter string){
	fmt.Println(letter)
}

运行结果:

main中执行了。。。。
100
我是fun1函数。。num: 100
我是fun1函数。。num: 1
world
hello

range

range调用返回两个值,一个是引用的索引,另一个是值

for _ , v := range nums {
		if v > max {
			max = v
		}

匿名函数

定义一个匿名函数,直接进行调用,通常只能调用一次,也可以将匿名函数赋值给某个函数变量,就可以调用多次

  • 将函数作为另一个函数的参数,回调函数
  • 将函数作为另一个函数的返回值

高阶函数

func1()func2()

将func1函数作为func2这个函数的参数,func2就叫做高阶函数

func1():回调函数

闭包

一个外层函数中,有内层函数,该内层函数中,会操作外层函数中的局部变量(外层函数中的参数,
或者外层函数直接定义的变量),并且该外层函数的返回值就是这个内层函数。

posted @ 2021-03-31 19:40  Gumi-21  阅读(60)  评论(0)    收藏  举报