我是一名初学者,正在观看学习 goolang 界面的教程。
package main
import "fmt"
func main() {
a := incrementInt(0)
//b := incrementor(&a)
for i := 0; i < 10; i++ {
fmt.Println(a.increment()) //b.increment()
}
type incrementor interface {
increment() int
}
type incrementInt int
func (inc *incrementInt) increment() int {
*inc++
return int(*inc)
}
我的问题是,程序在不声明 b :=incrementor(&a) 的情况下工作正常,但教程使用了 b 变量并使用 b.increment() 而不是 a.increment() 两种方法都可以执行,但我想知道其中的区别。
谢谢你
接口的目标是从特定类型中抽象出实现
行
a := incrementInt(0)
创建了一个incrementInt类型的变量a
第
b := incrementor(&a)
行创建一个增量器类型的变量b,同时将a的地址类型转换为接口增量器。因此,如果您有通用代码,它将有助于理解使用接口进行抽象的好处
例如-在下面的代码中,我创建了一个incrementFloat并将它们添加到名为
incs
的增量器切片中,现在我可以继续创建incrementXXX类型,而无需更改主函数循环中的代码
package main
import "fmt"
func main() {
a := incrementInt(0)
b := incrementor(&a)
c := incrementFloat32(0.0)
d := incrementor(&c)
incs := []incrementor{b, d}
for _, incx := range incs {
for i := 0; i < 10; i++ {
fmt.Println(incx.increment())
}
}
}
type incrementor interface {
increment() any
}
type incrementInt int
func (inc *incrementInt) increment() any {
*inc++
return int(*inc)
}
type incrementFloat32 float32
func (inc *incrementFloat32) increment() any {
*inc += 0.1
return float32(*inc)
}