package main
import (
"github.com/m/example/mypkg"
)
func main() {
abc := NewAbc()
abc.Format()
}
type Abc struct {}
func (a *Abc) Format() string {
return "abc"
}
func (a *Abc) serialize() {}
func NewAbc() mypkg.Serializable {
return &Abc{}
}
导致cannot use &Abc{} (value of type *Abc) as mypkg.Serializable value in return statement: *Abc does not implement mypkg.Serializable (missing method serialize)错误,即使serialize被定义为方法。因为它没有被导出,所以mypkg包看不到它,所以它不能满足接口,从而保证用户将需要使用提供的构造函数之一。
type A struct {
Val string
}
func (a A) Format() string {
b, _ := json.Marshal(a)
return string(b)
}
func (a A) Parse(val string) Serializable[A] {
var res A
_ = json.Unmarshal([]byte(val), &res)
return a
}
2条答案
按热度按时间kzipqqlq1#
Go语言没有明确的构造函数概念,因为没有好的构造函数语法。但是有一种方法可以强制包的用户使用您定义的方法之一来构造接口。
要做到这一点,你只需在接口中包含一个私有方法:
尝试从包外部实现
Serializable
,如下所示:导致
cannot use &Abc{} (value of type *Abc) as mypkg.Serializable value in return statement: *Abc does not implement mypkg.Serializable (missing method serialize)
错误,即使serialize
被定义为方法。因为它没有被导出,所以mypkg
包看不到它,所以它不能满足接口,从而保证用户将需要使用提供的构造函数之一。kd3sttzy2#
如果我正确理解了这个问题,你可以尝试使用
generics
来参数化Serializable
接口:然后创建特定的构造函数:
PLAYGROUND