代码链接 ./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;
}