3 回答
TA贡献1772条经验 获得超8个赞
您不能分配类型。您必须分配实例。您的代码实际上必须如下所示。我在您要更改的两行中添加了注释。
package main
import "fmt"
type B struct {
filed1 string
field2 string
//etc
}
type A struct {
filed1 string
field2 string
//etc
}
func main() {
var model interface{}
modelName := "b"
if modelName == "a" {
model = A{} // note the {} here
} else {
model = B{} // same here
}
fmt.Println(model)
}
只是一个忠告,您可能不想使用泛型interface{}类型,而最好使用同时实现A和的实际接口B。泛型接口类型会让你更头疼,并且真的违背了使用像 Go 这样的静态类型语言的目的。
TA贡献1765条经验 获得超5个赞
您收到错误是因为您试图为interface{}实例分配类型。您需要分配一个实例。
如果你有;
var model interafce{}
if modelName == "a"{
model = models.A{}
}
else{
model = models.B{}
}
那么它会工作正常。
TA贡献1831条经验 获得超10个赞
这是带有接口类型实现的编辑程序:
package main
import (
"log"
)
//// Interfaces ////
type PhotoManager interface {
AddPhotos(id string) (bool, error)
}
//// Post ////
type Post struct {
Photos []string
}
func (p *Post) AddPhotos(id string) (bool, error) {
p.Photos = append(p.Photos, id)
return true, nil
}
//// Product ////
type Product struct {
Photos []string
Docs []string
}
func (p *Product) AddPhotos(id string) (bool, error) {
p.Photos = append(p.Photos, id)
return true, nil
}
// Useless function to demonstrate interface usage //
func AddPhotoToInterfaceImplementation(id string, pm PhotoManager) {
pm.AddPhotos(id)
}
//// Main ////
func main() {
post := Post{}
product := Product{}
post.AddPhotos("123")
product.AddPhotos("321")
AddPhotoToInterfaceImplementation("456", &post)
AddPhotoToInterfaceImplementation("654", &product)
log.Println(post)
log.Println(product)
}
这里的活动部分是:
PhotoManager interface用于定义具有泛型函数的接口的类型
AddPhotoson的实现Post并Product提供接口函数的实际实现
使用pm PhotoManageras 参数来AddPhotoToInterfaceImplementation显示接口类型的用法。
- 3 回答
- 0 关注
- 195 浏览
添加回答
举报