这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
今天学习了go语言的闭包关系 和go语言的指针操作
在一个函数的生命周期内 某个变量的值将会继承举个例子,我们有一个函数是进行数学运算的函数
这个函数的参数是要被处理的数是int类型的 返回值则是两个函数一个函数负责加运算 另一个负责减运算
package main
import "fmt"
func cal(a int) (func(int) int, func(int) int) {
s := a
sub := func(y int) int {
s = s - y
return s
}
sum := func(y int) int {
s = s + y
return s
}
return sub, sum
}
func main() {
sub, sum := cal(100)
a := sub(50)
fmt.Printf("a: %v\n", a)
a = sub(25)
fmt.Printf("a: %v\n", a)
a = sum(50)
fmt.Printf("a: %v\n", a)
a = sum(50)
fmt.Printf("a: %v\n", a)
}
由于s在函数存活周期内所以s的值是和每一步紧紧相关的,接下来看看结果
可以观测到s的值是继承上一个s的值的
在go语言中有一种函数是init类型的 他们没有参数也没有返回值,该函数先于main函数执行,可以进行初始化,变量初始化先进行,init(该函数既没有参数也没有返回值)先于main执行,再然后是main函数,可以有多个init函数 他们执行的顺序和你写的顺序有关
关于指针 go和c的指针不太一样 特别体现在数组方面 c的指针会指向数组首地址,而go的指针是指向数组每个元素
a := [5]int{1, 2, 3, 4, 5}
var w [5]*int
fmt.Printf("w: %v\n", w)
for k, _ := range a {
w[k] = &a[k]
}
for _, v := range w {
fmt.Printf("v: %v\n", v) //指针数组并非指向数组首元素的地址而是指向每个元素的地址
}
指针直接赋值时需要开辟空间使用new(datatype)来申请分配空间
结构体可以用
type student struct {
number string
name string
id int
age int
marr bool
}
定义一个结构体类型的变量名 student
然后var dataname student
就可以通过data.number来调用该数据 也可以使用匿名结构体 直接 var dog struct{ name string age int }
就可以调用dog.name
关于type 我们可以使用type myint int来进行变量定义
也可以用type myint=int来进行变量别名