go语言第五天 | 青训营笔记

49 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的值是和每一步紧紧相关的,接下来看看结果

image.png

可以观测到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) //指针数组并非指向数组首元素的地址而是指向每个元素的地址
	   	} 

image.png

指针直接赋值时需要开辟空间使用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来进行变量别名