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

问题描述 投票:0回答:1

我是一名初学者,正在观看学习 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() 两种方法都可以执行,但我想知道其中的区别。

谢谢你

go pointers interface
1个回答
2
投票

接口的目标是从特定类型中抽象出实现

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

© www.soinside.com 2019 - 2024. All rights reserved.