Ошибка в маршале и Unmarshall в Голанге - PullRequest
0 голосов
/ 06 ноября 2018

Я новичок в 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, msg. Ошибка запуска контейнера: ошибка запуска контейнера: ошибка при создании сборки докера для конкретной платформы: ошибка, возвращаемая из сборки: 2 "# github.com / fabcar / идти chaincode / input / src / github.com / fabcar / go / fabcar.go: 110: 8: результат без имени. Статус в левой части: = chaincode / input / src / github.com / fabcar / go / fabcar.go: 111: 20: нет новых переменных в левой части: = «

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

a, b := 5, 6 a и b объявлены и инициализированы. Если мы снова будем использовать их в выражении типа a, _ := some_func(), произойдет ошибка, и в левой части этого выражения будет отсутствовать новая переменная. Если хотя бы один из них не объявлен ранее, он будет выполнен без такой ошибки.

Итак, в вашем случае измените это

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

до

result.Status = args[1]
licenceAsBytes, _ = json.Marshal(result)
0 голосов
/ 06 ноября 2018

Как указывало @ icza , вы не можете использовать сокращенную запись дважды в одном блоке, например:

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

Второй должен читать:

licenceAsBytes, _ = json.Marshal(result)

Аналогично, следующее недействительно:

result.Status := args[1]

, поскольку он не определяет новую переменную (он присваивает значение структурному полю).

Хотя это и не ошибка, для всего, что может появиться в работе, вы, вероятно, не хотите игнорировать ошибки в молчании (как делает ваш текущий фрагмент кода, 3x).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...