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)
    }
}

 

posted @ 2018-01-25 09:41  怪人怪性  阅读(105)  评论(0)    收藏  举报