You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hashicorp go-plugin共享接口传参异常:调用无响应无报错

问题描述

基于Hashicorp go-plugin官方示例开发Go插件,需暴露接收JSON字符串参数的CdExec(string)方法,返回包含data和status字段的JSON字符串。调用插件时无报错但返回空结果,日志显示插件已启动且方法被调用,但最终输出为空。

核心问题定位

1. RPC客户端未传递实际参数

共享接口的CdExecutorRPCClient.CdExec方法中,RPC调用时传入的是空接口指针new(interface{}),并未将实际的请求参数传递给服务端:

// 错误代码
err := g.client.Call("Plugin.CdExec", new(interface{}), &resp)

服务端收到空值,导致后续处理无有效输入。

2. RPC服务端参数处理与错误丢弃

服务端CdExecutorRPCServer.CdExec方法参数类型定义为interface{},且丢弃了插件方法返回的错误:

// 错误代码
func (s *CdExecutorRPCServer) CdExec(args interface{}, resp *string) error {
    fmt.Println("CdExecutorRPCServer::args:", args)
    *resp, _ = s.Impl.CdExec(fmt.Sprintf("%v", args))
    return nil
}

客户端未传参数导致args为空,插件解析空JSON字符串失败,但错误被丢弃,客户端无法感知问题,最终返回空结果。

修复方案

1. 修正RPC客户端参数传递

修改共享接口的CdExecutorRPCClient.CdExec方法,传递实际请求参数:

func (g *CdExecutorRPCClient) CdExec(req string) (string, error) {
    var resp string
    // 传递实际的req参数
    err := g.client.Call("Plugin.CdExec", req, &resp)
    if err != nil {
        return "", err
    }
    return resp, err
}

2. 修正RPC服务端参数类型与错误处理

调整服务端方法参数类型为字符串,并返回实际错误:

func (s *CdExecutorRPCServer) CdExec(args string, resp *string) error {
    fmt.Println("CdExecutorRPCServer::args:", args)
    var err error
    *resp, err = s.Impl.CdExec(args)
    // 返回错误给客户端
    return err
}

验证修复

重新编译插件与宿主程序:

go build -o ./plugin/executor ./plugin/plugin.go
go build -o CdPluginHost .

执行宿主程序后,将得到预期输出:

Plugin Result: {"data":"Your result data","status":"success"}

内容的提问来源于stack exchange,提问作者goremo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:50:10