英文:
using pointers and interfaces and cutom types
问题
我是你的中文翻译助手,以下是翻译好的内容:
我是一个初学者,正在观看一个关于学习Go语言接口的教程。
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()
。两种方式在执行上都是可以的,但我想知道它们之间的区别。
谢谢。
英文:
i'm a beginner and watching a tutorial for learning interfaces in 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)
}
my question is, the program works fine without declaring b := incrementor(&a), but the tutorial used the b variable and used b.increment() instead of a.increment()
both ways are ok in execution but i want to know the difference.
thank you
答案1
得分: 2
接口的目标是将实现与特定类型抽象出来。
a := incrementInt(0)
这一行创建了一个类型为 incrementInt 的变量 a。
b := incrementor(&a)
这一行创建了一个类型为 incrementor 的变量 b,同时将 a 的地址强制转换为接口 incrementor 的类型。因此,如果你有一个通用的代码,使用接口来进行抽象化将会有所帮助。
例如,在下面的代码中,我创建了一个 incrementFloat,并将它们都添加到名为 incs
的 incrementor 切片中。现在,我可以继续创建 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)
}
英文:
The objective of an interface is to abstract the implementation from specific types
The line a := incrementInt(0)
creates a variable a of type incrementInt
The line b := incrementor(&a)
creates a variable b of type incrementor while typecasting the address of a to the interface incrementor. So if you had a generalized code it would help to understand the benefit of using interfaces for abstraction
For Example- In the code below I created an incrementFloat and add both of them to a slice of incrementor named incs
now I can keep on creating incrementXXX types without having to change the code in the loop of the main function
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论