【问题标题】:In go, how do you create an interface when methods are called by *Type?在go中,当方法被*Type调用时,如何创建接口?
【发布时间】:2011-09-20 02:31:42
【问题描述】:

试图创建一个接口,但方法有*Type,而不是Type 接收器

APOLOGIZE:困了,误读了错误信息。以为我被阻止创建数据库接口,而实际上我误用了它。抱歉……以后会更加小心!

输入字符字符串 func (*Char) toType(v *string) 接口{} { 如果 v == nil { 返回 (*Char)(nil) } var s 字符串 = *v ch := 字符(s[0]) 返回&ch } func (v *Char) toRaw() *string { 如果 v == nil { 返回(*字符串)(无) } s := *((*string)(v)) 退货 }

从这里我想要一个包含 toTypetoRaw 方法的接口

类型数据库接口{ toRaw() *字符串 toType(*string) 接口{} }

不起作用,因为函数接收器是指针。我这样说是因为当我尝试使用它时,我得到了 error.k

Char 没有实现 DB(toRaw 方法需要指针接收器)

有没有办法从toTypetoRaw 创建接口,还是我需要备份并让接收者成为类型本身而不是指向类型的指针?

【问题讨论】:

  • 不知何故很难理解代码背后的想法。请提供更多信息。
  • 尝试使用函数toRawtoType 创建数据库接口。但不能,因为函数的接收者是指针。有什么方法可以声明包含toRawtoType 的数据库接口?

标签: types go


【解决方案1】:

如果为指针类型定义接口方法,则必须将指针传递给期望该接口的方法/函数。

【讨论】:

  • “你应该总是传递一个指针的接口”这不是真的。非指针类型可以通过实现必要的方法来符合接口,就像指针类型一样容易。
  • 这行不通。 c := &Char("foo") 不是有效的声明。不能取"foo"的地址。
【解决方案2】:

我不明白你的问题是什么。是的,按照您的编写方式,*Char 符合接口 DBChar 不符合。你可以

  1. 更改您的代码,以便方法直接对非指针类型Char 进行操作(这也将自动适用于*Char
  2. 仅当您需要与DB 类型兼容的内容时才使用*Char

【讨论】:

  • 问题是我无法使用接收器为指针的方法创建接口。这是真的还是有办法解决?
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多