手记

Golang 接口学习心得(二)

package main

import (
    "fmt"
    "math"
)

/*

记录个笔记,关于接口内的方法,返回值包含接口。

首先如下:

我定义了 Shape 接口,该接口有 Round() 方法,返回值为 float64,

又定义了 Value 接口,该接口有 Calculate() 方法,但是其返回值为 Shape 接口类型!

首先,我定义了 Circle 结构体,用来实现 Round() 方法,根据接口的实现的定义 "一个结构体,实现了接口的所有方法,他就实现了这个接口!",

可以看出,Circle 结构体已经实现了 Shape 接口!

然后,我定义了 Str 结构体,实现了 Value 接口。

关键点在于:

在 Value 接口的 Calculate() 方法中,我的返回值,实际上是指针型的 Circle 结构体!!!

也就是说,虽然 Calculate() 要返回的是 Shape 接口类型,但实际上,需要的是实现 Shape 接口的结构体!

并不是要返回某个接口!这一点,困扰了我两天,希望以后看到笔记,能有所领会!

此外!!

error 其实也是一个接口类型,无形之中我已经做了很多次方法返回接口类型参数的实例,

然而处于一种 "知其然不知其所以然" 的状态!

小师傅说过,多学原理,长点心吧!

PS: 终于领会到了一句话 "只可意会不可言传"!!

*/

type Shape interface {
    Round() float64
}

type Value interface  {
    Calculate() Shape
}

type Circle struct {
    radius float64
}

type Str struct {

}

func (str *Str) Calculate() Shape  {
     cir := &Circle{
         radius:0.5,
     }
    res2 := Shape(cir).Round()
    fmt.Println(cir.radius)
    fmt.Println(res2)
    return cir
}

func (cir *Circle) Round() float64  {
    //cir.radius = a
    fmt.Println(">>>>>",cir.radius)
    round := cir.radius * math.Pi * 2
    return round
}

func main()  {
    str := &Str{}
    res1 := Value(str).Calculate()
    fmt.Println(res1)
}
6人推荐
随时随地看视频
慕课网APP

热门评论

查看全部评论