当前位置: 首页 > 面试题库 >

为什么不能同时为结构及其指针定义方法?

司迪
2023-03-14
问题内容

给定golang巡回演出的第54张幻灯片中的设置:

type Abser interface {
    Abs() float64
}

type Vertex struct {
    X, Y float64
}

func (v *Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

为什么不能同时为结构体和指向结构体的指针定义方法?那是:

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

定义此将产生以下错误:

prog.go:41: method redeclared: Vertex.Abs
    method(*Vertex) func() float64
    method(Vertex) func() float64

问题答案:

它可以。只需在结构而不是指针上定义它即可。它将解决两种方式

方法集

对应的指针类型 T的方法集是接收者 T或T的所有方法的集(即,它也包含T的方法集)

尝试直播:http://play.golang.org/p/PsNUerVyqp

package main

import (
    "fmt"
    "math"
    )

type Abser interface {
    Abs() float64
}

type Vertex struct {
    X, Y float64
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func main() {
    v := Vertex{5, 10}
    v_ptr := &v
    fmt.Println(v.Abs())
    fmt.Println(v_ptr.Abs())
}

更新: 根据评论,我创建了一个额外的示例,该示例实际上利用Abser接口来说明值和指针都满足该接口。

https://play.golang.org/p/Mls0d7_l4_t



 类似资料:
  • 在C中不使用sizeof查找数组大小的问题中,asker将int数组视为int数组的数组,方法是获取地址,然后指定数组索引为1:

  • 问题1. 为什么将原生指针放到智能指针里后,再通过 get()取出来的地址和原生指针地址不同呢? 比如例子中打印的base0和 base2不同。 问题2. 为什么将 nullptr 放到智能指针里后,通过 get()取出来的地址不是 nullptr 呢? 那如果判断智能指针管理的原生指针是否为 nullptr呢? 输出: base0=0x156704080 base1=0x0 base2=0x15

  • 问题内容: 假设我们了解到, 用于类型明确的方法定义,GO编译器隐式定义了相同的方法类型和 反之亦然 ,如果我声明, 并宣布 然后GO编译器给出错误, 这表明,指针方法是隐式定义的, 反之亦然 在下面的代码中, GO编译器出现错误, 在,因为隐式指针方法满足接口,但是隐式非指针方法不满足。 题: 为什么隐式非指针方法不满足接口? 问题答案: 让我们看一下语言规范: 类型可能具有与之关联的 方法集

  • 问题内容: 我有一个采用SResource对象列表的方法 我为什么不能这样做 (编译器告诉我我必须使用SResource对象。) 当IndexResource是SResource的子类时 我本以为必须做到这一点,所以也许我在做其他错误的事情。如果您建议,我可以发布更多代码。 问题答案: 您可以使用通配符: 新声明使用有 界通配符 ,表示通用参数将是或扩展它的类型。 作为接受这种方式的交换,“做某事

  • 问题内容: 我习惯于进行Java编程,在编程时,您无需真正考虑指针。但是,此刻我正在用C ++编写程序。在创建具有其他类成员的类时,何时应该使用指针,何时不应该使用指针?例如,什么时候我想这样做: 与此相反: 问题答案: 首先避免指针。 在以下情况下使用它们: 您想使用Pimpl习惯用法或抽象工厂。 该实例实际上是由程序的其他部分管理的,而该类仅需要能够访问它。 您想推迟对象的构建(即,您想 在