使用指针、接口和自定义类型。

huangapple go评论81阅读模式
英文:

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 &quot;fmt&quot;

func main() {
a := incrementInt(0)
//b := incrementor(&amp;a)
for i := 0; i &lt; 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(&amp;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 &quot;fmt&quot;

func main() {
	a := incrementInt(0)
	b := incrementor(&amp;a)
	c := incrementFloat32(0.0)
	d := incrementor(&amp;c)
	incs := []incrementor{b, d}
	for _, incx := range incs {
		for i := 0; i &lt; 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)
}

huangapple
  • 本文由 发表于 2023年6月16日 19:07:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/76489587.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定