函数
在Go语言中,函数是一种可执行的代码块,用于执行特定的任务。函数由函数名、参数列表、返回值列表和函数体组成
func add(a int, b int) int {
return a + b
}
在上面的例子中用func定义了一个名为add的函数,该函数需要两个int的参数,返回一个int类型的值。
函数返回值
Go语言中的函数当然也可以有多个返回值,可以使用逗号分隔的形式来定义返回值列表。如下面这个例子返回了a,b的和与差。
func addandsub(a int, b int) (int, int) {
return a + b, a - b
}
返回值也可以命名,将返回值命名为sum和sub,而在这种情况下可以直接return,就相当于return sum,sub
func addandsub(a int, b int) (sum int, sub int) {
sum = a + b
sub = a - b
return
}
匿名函数
Go语言支持匿名函数,也称为闭包。匿名函数是一种没有函数名的函数,声明之后立即执行。 匿名函数可以直接调用,也可以赋值给变量后调用。如下面这两个简单的用法。
func() {
fmt.Println("hello world")
}()
var str string = "hello world"
length := func(s string) int {
return len(s)
}(str)
fmt.Println(length)
另外在go中函数也是一种数据类型。
指针
在Go语言中,指针是一种特殊的变量类型,用于存储变量的内存地址。通过指针,我们可以直接访问和修改变量的值,而不是通过变量本身。
要声明一个指针变量,可以使用*运算符,例如:
var p *int
这里的p是一个指向int类型的指针变量。我们可以使用&运算符来获取变量的地址,并将其赋值给指针变量,例如:
var a int = 42
p = &a
现在,p指向了变量a的地址。我们可以通过*运算符来访问指针指向的值,例如:
fmt.Println(*p) // 输出 42
在上面的例子中,*p表示指针p指向的值。
指针也可以用于修改变量的值,例如:
*p = 24
fmt.Println(a) // 输出 24
在这里,通过*p修改了a的值为24。
defer
defer是一个延迟执行的关键字。
defer语句的语法形式为:defer 函数调用。当函数执行到defer语句时,不会立即执行函数调用,而是将该调用推迟到函数执行完毕之前。
函数结束前以后进先出的方式调用defer。
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
//3
//2
//1
数组
数组是一种固定长度的数据类型,如var arr [3]int就可以声明一个长度为3,变量名为arr的int数组,还有以下几种声明方法
var arr [3]int
var arr0 [2]int = [2]int{1,2}
arr1 := [2]int{1,2}
arr2 := [...]int{1,2,3}
索引
数组的索引从0开始,如一个长度为3的数组,他的索引可以是0、1、2
遍历
可以用for循环来遍历数组
for i, value := range arr {
fmt.Println(i, value)
}
切片
切片基于数组,但是比数组更加灵活,在下面的例子中定义了一个arr数组,slice从arr中得到了索引为0到2的元素(不包括索引为2)
切片是对数组的引用,如果改变了slice中的值,arr的值也会改变。
arr := [5]int{1, 2, 3, 4, 5}
slice := arr[0:2]
fmt.Println(slice)
切片是一个引用类型,如果直接声明slice:=[]int,而不进行赋值,slice的默认值为nil。
我们可以使用make来为切片分配内存空间如s := make([]int, 3,5)就可以为s分配长度为3的内存空间,默认值为0,容量为5。
切片常用方法
追加元素
s := []int{1, 2}
s = append(s, 3)
fmt.Println(s)
//[1 2 3]
当追加元素超过容量时,自动将切片容量翻倍
复制
copy函数会将源切片中的元素复制到目标切片中,如果目标切片容量小于源切片,则不复制多余的内容
s1 := make([]int, 2, 2)
copy(s1, s)
fmt.Println(s1)
// [1 2]