在下面创建区块链智能合约功能时,我是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::=的左侧没有新变量 “
答案 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, 6
和a
被声明和初始化。如果再次在b
之类的语句中使用它们,则将发生错误,并且该语句的左侧将没有新的变量。如果至少其中之一没有事先声明,那么它将执行而不会出现此类错误。
因此,根据您的情况,对此进行更改
a, _ := some_func()
到
result.Status := args[1]
licenceAsBytes, _ := json.Marshal(result)