Skip to content

Latest commit

 

History

History
125 lines (109 loc) · 3.46 KB

summary.md

File metadata and controls

125 lines (109 loc) · 3.46 KB

第二天

代码链接 ./1-test.go

函数 定义如下

	func funcName(input1 type, input2 type) (output1 type, output2 type) {
		// ... do something
		return value1, value2
	}

go里面可以为函数的返回值申明变量,当然这种写法也是可以的 func funcName(input1 type, input2 type) (type, type) {}

  • ps: golang 没有三元表达式~~

defer 延迟(defer)语句,你可以在函数中添加多个defer语句。当函数执行到最后时,这些defer语句会 按照逆序执行,最后该函数返回进行一些打开资源的操作时,遇到错误需要提前返回,在返回前你需要关闭相应的 资源,不然很容易造成资源泄露等问题

func readFile() bool {
 	file.Open("file")
 	if errX {
 		file.close()
 		return false;
 	}
 	if errY {
 		file.close()
 		return false;
 	}
 	file.close()
 	return true;
 }

使用defer优化之后

func readFile() bool {
 	file.Open("file")
 	defer file.Close() // defer 会在函数退出前调用
 	if errX {
 		return false;
 	}
 	if errY {
 		return false;
 	}
 	return true;
 }

如果有很多调用defer,那么defer是采用后进先出的方式执行

func mockReadFile() {
	fmt.Println("打开文件")
	defer fmt.Println("记录日志")
	defer fmt.Println("关闭文件")
	fmt.Println("做一些事情")
}

/*
打开文件
做一些事情
关闭文件
记录日志
*/

同脚本语言一样,golang 也是可以将函数 作为值、类型进行传递的 通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值

type testInt func (int, int) int // 定义一个函数类型

// 函数当做值和类型 写一些通用接口的时候非常有用
func useType(a int, b int, f testInt) (value int) {
	value = f(a, b)
	return
}

for 也可以配合 range 用于读取 splice 和 map的 数据

simpleMap := map[string]int { "one":1, "two":2, "three":3 }
	for key, value:= range simpleMap {
		fmt.Printf("simpleMap key is %s \n", key)
		fmt.Printf("simapleMap Value is %d \n", value)
	}

go是支持使用指针传参的,所以传入指针的时候时候,修改是会对所有的东西进行修改。而且和java的继承方式一样,也有继承、重写这两种操作,差距不大。

interface能够接受struct的函数,但是函数描述必须一致,参数列表和返回内容也是一样的才能进行代理。
struct的String方法类似于java的toString的写法。而空interface是可以接受任何参数

type voidActivity interface {}

而且interface 是支持数组列表循环调用的,而且 comma-ok断言可以 来确认是否存储了T类型。value就是变量的值,ok是一个bool类 型,element是interface变量,T是断言的类型

value, ok = element.(T)

如果element里面确实存储了T类型的数值,那么ok返回true,否则返回false。

	if value, ok := activity.(Developer); ok {
		fmt.Println("activity 是Developer 值是", value)
	}

当然也是可以用以下方法

  actList := make([]HumanActivity, 3)
	actList[0], actList[1], actList[2] = yyy, tom, grace // 也能用 slice 进行结构

	for _, element := range actList {
		// 判断 数组中的 interface 是不是特定的类型
		if value, ok := element.(Developer); ok {
			fmt.Println("has info", value, ok)
		}
	}

	switch value := element.(type) {
		case Developer:
		break;
		case Person;
		break;
		default:
		break;
	}