golang中的元帅和Unmarshall错误

时间:2018-11-06 12:56:57

标签: go

在下面创建区块链智能合约功能时,我是golang的新手

func (s *SmartContract)  changeStatus(APIstub shim.ChaincodeStubInterface,args[]string) sc.Response{
    if len(args) != 2 {
        return shim.Error("Incorrect number of arguments. Expecting 2")
    }
    licenceAsBytes, _ := APIstub.GetState(args[0]);
    var result Licence
    json.Unmarshal([]byte(licenceAsBytes), result)
    result.Status := args[1]
    licenceAsBytes, _ := json.Marshal(result)
    APIstub.PutState(args[0], licenceAsBytes);

    return shim.Success(nil)

} 

调用此函数时,出现以下错误:

  

错误:无法组装事务,错误的提案响应未成功,错误代码500,味精错误启动容器:错误启动容器:无法生成特定于平台的Docker构建:从构建返回的错误:2“#github.com / fabcar / go   chaincode / input / src / github.com / fabcar / go / fabcar.go:110:8:非名称结果。状态位于:=左侧   chaincode / input / src / github.com / fabcar / go / fabcar.go:111:20::=的左侧没有新变量   “

2 个答案:

答案 0 :(得分:2)

@icza pointed out一样,您不能在一个块中使用两次速记符号,如下所示:

licenceAsBytes, _ := APIstub.GetState(args[0]);
...
licenceAsBytes, _ := json.Marshal(result)

第二个应显示为:

licenceAsBytes, _ = json.Marshal(result)

类似地,以下无效:

result.Status := args[1]

因为它没有定义新变量(它为struct字段分配了一个值)。

虽然不是错误,但可能会投入生产,但您可能不想静默忽略错误(就像您当前的代码片段一样,是3倍)。

答案 1 :(得分:0)

user_agent a, b := 5, 6a被声明和初始化。如果再次在b之类的语句中使用它们,则将发生错误,并且该语句的左侧将没有新的变量。如果至少其中之一没有事先声明,那么它将执行而不会出现此类错误。

因此,根据您的情况,对此进行更改

a, _ := some_func()

result.Status := args[1]
licenceAsBytes, _ := json.Marshal(result)