golang基础知识总结(3)
函数的闭包:
Go函数的闭包,在我个人的理解上其实就是在一个函数a中定义一个变量,然后返回一个函数b,返回的这个函数b可以对a函数定义的变量进行操作。
func test() func(int) int { //test是一个函数名, 而func(int) int 只是一个返回值,代表返回的是一个函数 sum := 0 //函数内部的全局变量,下面返回的匿名函数,对这个变量的操作是持续并且有效的(下面会详细说) return func(x int) int { //返回一个 func(int) int 类型的函数,这个函数的返回值是 int sum += x return sum } } func main() { a := test() //定义一个变量,并把test函数的返回值赋值给这个变量,这个变量实际上是一个函数,变量名就是函数名,这个函数的功能就是将给定的数字,加到test()函数内部定义的sum中去 //这个for循环内的代码主要完成的功能是:不断地将给定的数字加到test()函数内部定义的sum变量中 for i := 0; i < 10; i++ { fmt.Println(a(i)) } //可以用Java对象来理解,a := test() 相当于初始化了一个对象,这个对象中定义的成员变量是sum,而对象中的成员函数就是函数返回的匿名对象,只要对象不销毁(生命周期内),sum的值就可以一直被累加。 //class Test { // int sum = 0; //成员变量 // public int add(int x) { //成员函数 // sum += x; // return sum // } //} }
接口:
接口在Go语言中是一个比较重量级的概念,这么说是因为,它不是一个纯粹的面向对象的概念,不需要显示的继承(只需要实现接口中的方法),多态则完全依赖接口的实现。其本质就是组合。它是一个方法的集合,但不包含方法的实现,也不能包含变量。
个人对于golang接口的理解:
1、与其他面向对象的语言不通,接口的实现不需要显示的声明,是被隐式实现的。
2、一个类型可以实现多个接口,多个类型可以实现一个接口。
3、只要一个类型实现了接口中的某个方法,那么这个接口的变量就可以接受这个类型的变量。
//接口 //以创建一个自定义的error为例,这个自定义的error实现的功能是:要求输入的数字不能为负数,否则就报错 type ErrNegativeSqrt float64 //类型等价定义,相当于重命名 func (e ErrNegativeSqrt) Error() string { // ErrNegativeSqrt这个类型实现了error接口中的Error方法,是隐式实现的(总结的第一条),因为实现了error接口,所以可以进行这样的操作:error = ErrNegativeSqrt(第三条总结) return fmt.Sprintf("can not Sqrt negative number: %v", float64(e)) } //可以返回ErrNegativeSqrt为error的原因:ErrNegativeSqrt这个结构体实现了error的方法,因此error类型的变量就可以接受这个结构体类型的变量 func Sqrt(x float64) (float64, error) { if x < 0 { return 0, ErrNegativeSqrt(x) //重点在这里,这里有一个对应关系 float64 = 0 error = ErrNegativeSqrt(x) } z := x for i := 0; i < 10; i++ { z = (z + x/z) / 2 } return z, nil } func main() { if value, err := Sqrt(2); err != nil { fmt.Println(err) } else { fmt.Println(value) } if value, err := Sqrt(-2); err != nil { fmt.Println(err) } else { fmt.Println(value) } }

浙公网安备 33010602011771号