繁体   English   中英

Go 语言类型断言

[英]Go lang type assertion

我正在尝试通过应用依赖倒置原则在golang中进行依赖注入,所以我有以下服务

package account

import (
    types "zaClouds/modules/account/domain/types"
    "zaClouds/modules/shared"
)

type IPlanDomainService interface {
    GetUsagePlanById(string) *shared.Result[types.UsagePlan]
}

type PlanDomainService struct {
    usagePlanService types.IUsagePlanService
}

func (planDomainService *PlanDomainService) GetUsagePlanById(id string) *shared.Result[types.UsagePlan] {
    result := &shared.Result[types.UsagePlan]{}
    usagePlanResult := planDomainService.usagePlanService.GetPlanById(id)

    if usagePlanResult.Err != nil {
        result.Err = usagePlanResult.Err
        return result
    }
    result.Data = usagePlanResult.Data
    return result
}

func PlanDomainServiceFactory(usagePlanService types.IUsagePlanService) IPlanDomainService {
    return &PlanDomainService{usagePlanService: usagePlanService}
}

如您所见,它接受另一个类型为IUsagePlanService的服务

这是它的界面

package account

import (
    "zaClouds/modules/shared"

    "github.com/shopspring/decimal"
)

type UsagePlan struct {
    ID          string
    Title       string
    Description interface{}
    PlanID      string
    Price       decimal.Decimal
    Duration    int
    Features    map[string]map[string]string
}
type IUsagePlanService interface {
    GetPlanById(string) *shared.Result[UsagePlan]
}

这是我将此服务注入域服务的方式

func DiInit(usagePlanService interface{}) domainServices.IPlanDomainService {
domainServices.PlanDomainServiceFactory(types.IUsagePlanService(usagePlanService))
    return domainServices.PlanDomainServiceFactory(usagePlanService.(types.IUsagePlanService))
}

如您所见,我正在尝试进行类型断言,但它不起作用,并给我以下错误:

panic: interface conversion: *usagePlan.UsagePlanRepository is not account.IUsagePlanService: missing method GetPlanById

编辑

这是usagePlanService的实际实现

type IUsagePlanRepository interface {
    createClient(string) *http.Request
    GetPlanById(string) *shared.Result[usagePlanRepoModels.UsagePlan]
}

type UsagePlanRepository struct {
    plansEndpoint string
    httpClient    *http.Client
}

func (r *UsagePlanRepository) GetPlanById(id string) *shared.Result[usagePlanRepoModels.UsagePlan] {
    result := &shared.Result[usagePlanRepoModels.UsagePlan]{}

    req := r.createClient(id)
    resp, err := r.httpClient.Do(req)

    if err != nil {
        log.Println("failed to load plan details \n[ERROR]", err)
        result.Err = err
        return result
    }

    defer func() {
        bodyError := resp.Body.Close()

        if bodyError != nil {
            result.Err = bodyError
        }

    }()

    if result.Err != nil {
        return result
    }

    body, err := ioutil.ReadAll(resp.Body)

    if err != nil {
        utils.Logger.Error("failed to load plan details \n[ERROR]", err, nil)
        result.Err = err
        return result
    }

    if resp.StatusCode >= 400 {
        result.Err = errors.New(string(body))
        utils.Logger.Info("getPlanById", string(body))
    }

    getUsagePlanResponse, foundError := usagePlanRepoModels.CreateGetUsagePlanResponse(body)

    if foundError != nil {
        result.Err = foundError
        return result
    }

    result.Data = *getUsagePlanResponse
    return result

}

使用接口时,您需要使用与实现相同的名称和签名来定义您将使用的所有函数。

您收到的错误消息表明实现和接口不同。

您的问题中未显示该实现,但您为您的界面定义了 function,如下所示: GetPlanById(string) *shared.Result[UsagePlan] 任何偏离它都会导致错误。 一个常见的错误是指针。 如果返回类型与原始类型不同,则在返回类型中添加或删除*将导致错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM