Время выполнения Golang: размер стека goroutine превышает 1000000000 байт

Я получаю эту ошибку, когда пытаюсь Marshall создать объект вложенных структур. Мои структуры выглядят так:

type Blockchain struct{
    blocks []Block `json:"blocks"`
    difficulty int `json:"difficulty"`
}

type Block struct{
    index int `json:"index"`
    timestamp string `json:"timestamp"`
    data string `json:"data"`
    previousHash string `json:"previousHash"`
    hash string `json:"hash"`
    nonce int `json:"nonce"`
}

Когда я пытаюсь проверить свою структуру с помощью:

b, err := json.Marshal(blockchain)
if err != nil {
    panic(err)
}
fmt.Println(string(b))

Я получил:

runtime: goroutine stack exceeds 1000000000-byte limit

fatal error: stack overflow

runtime stack:

runtime.throw(0x4e4094, 0xe)

Также при инициализации

var blockchain = new(Blockchain)

func (blockchain *Blockchain) AddBlock(block Block) []Block {
    block.previousHash = latestBlock().hash
    blockchain.blocks = append(blockchain.blocks, mineBlock(blockchain.difficulty))
    return blockchain.blocks
}

func latestBlock() Block{
    return blockchain.blocks[len(blockchain.blocks)-1]
}

Когда я делаю:

var s = fmt.Sprintf("%#+v", *blockchain)
print(s)

Я получил:

main.Blockchain{blocks:[]main.Block{main.Block{index:1, timestamp:"2019-04-06 19:21:37", data:"Genesis block", previousHash:"", hash:"54baff26aa7411352c7879c4ad4bdb86cae07d667d1ed1962225bf0f464f78a0", nonce:0}, main.Block{index:2, timestamp:"2019-04-06 19:21:37", data:"d.duck", previousHash:"54baff26aa7411352c7879c4ad4bdb86cae07d667d1ed1962225bf0f464f78a0", hash:"c4e5d38c907c5b5db77f651880121ebbcb75b1c26d476071d9d69e4ae70e6a11", nonce:1}, main.Block{index:3, timestamp:"2019-04-06 19:21:37", data:"dumbo", previousHash:"c4e5d38c907c5b5db77f651880121ebbcb75b1c26d476071d9d69e4ae70e6a11", hash:"12c3f3595ce28923204c87a6e244ec66c34a7efb13a3acd3b6b57cea75a629d8", nonce:2}, main.Block{index:4, timestamp:"2019-04-06 19:21:37", data:"clown", previousHash:"12c3f3595ce28923204c87a6e244ec66c34a7efb13a3acd3b6b57cea75a629d8", hash:"8907be04c22ed0bc1d7d7b7ce13cf86f11f6fb3261ee34aaafc1fe6a703320b5", nonce:3}, main.Block{index:5, timestamp:"2019-04-06 19:21:37", data:"cod", previousHash:"8907be04c22ed0bc1d7d7b7ce13cf86f11f6fb3261ee34aaafc1fe6a703320b5", hash:"2d514943c6d86940dfca66e720c2aeade7de1fa1a053d36f81cbb134c02d0f26", nonce:4}, main.Block{index:6, timestamp:"2019-04-06 19:21:37", data:"omaha, omaha", previousHash:"2d514943c6d86940dfca66e720c2aeade7de1fa1a053d36f81cbb134c02d0f26", hash:"ef630c9a270a0ac52a2f5a0e2821ea91807b2471e4e4f7204c2edb4f44dd231b", nonce:5}, main.Block{index:7, timestamp:"2019-04-06 19:21:37", data:"double", previousHash:"ef630c9a270a0ac52a2f5a0e2821ea91807b2471e4e4f7204c2edb4f44dd231b", hash:"0c72339be0b54f7e87fcf48adf13f1d3b0e00ba56660906e8283758a74591ca3", nonce:6}, main.Block{index:8, timestamp:"2019-04-06 19:21:37", data:"fake", previousHash:"0c72339be0b54f7e87fcf48adf13f1d3b0e00ba56660906e8283758a74591ca3", hash:"ca31e0372579f0bfb00ac2ddb2127de0dff4d500f7dd6c507db7439380a40862", nonce:7}, main.Block{index:9, timestamp:"2019-04-06 19:21:37", data:"reverse", previousHash:"ca31e0372579f0bfb00ac2ddb2127de0dff4d500f7dd6c507db7439380a40862", hash:"ce4a1386c3aa9e45d1a5d5d3cc5a7d9d0b4e0e2d153a7c9518369a3ee65d5368", nonce:8}}, difficulty:4}

Ключи и поля видны, но ключи не заключены в двойные кавычки, как значения.

Обновлены структуры, чтобы иметь экспортируемые поля.

type Blockchain struct{
    Blocks []Block `json:"blocks"`
    Difficulty int `json:"difficulty"`
}

type Block struct{
    Index int `json:"index"`
    Timestamp string `json:"timestamp"`
    Data string `json:"data"`
    PreviousHash string `json:"previousHash"`
    Hash string `json:"hash"`
    Nonce int `json:"nonce"`
}

При повторной попытке того же маршала я получаю ту же ошибку.

Что такое blockchain? Не могли бы вы обеспечить инициализацию переменной? Может относиться к stackoverflow.com/q/3010357/9811969

Nik 07.04.2019 02:57

Я не понимаю, как это может быть циклично. Существует только один блокчейн, содержащий множество блоков.

pigfox 07.04.2019 04:00

Вопрос сколько блоков? Если вы хотите прочитать, например, все когда-либо созданные биткойн-блоки. Вам понадобится действительно много памяти.

apxp 07.04.2019 07:39

Ошибка возникает с 3, да, с тремя блоками, поэтому она не должна быть связана с этой маленькой цепочкой.

pigfox 07.04.2019 07:58

Итак, давайте попробуем получить эту ошибку на игровой площадке. Мой пример работает: play.golang.org/p/sVswvtR-aaH Что там по другому? Попробуйте создать ошибку внутри игровой площадки.

apxp 07.04.2019 08:51

Кое-что еще: при поиске ошибки вы не должны печатать ошибку с panic. Вместо этого используйте fmt.Print.

apxp 07.04.2019 08:52

Детская площадка, хорошая идея! Вот оно: play.golang.org/p/Dtf14gfGByq Если раскомментировать строки 149-155, появится ошибка.

pigfox 07.04.2019 20:32
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
2
7
2 544
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Программе не хватает места в стеке, потому что метод Blockchain.MarshalJSON и функция json.Marshal вызывают друг друга рекурсивно.

Исправьте, удалив метод Blockchain.MarshalJSON. Метод не нужен.

https://play.golang.org/p/vvXvRnRIpWL

вижу, очень круто! Теперь последний вопрос. Мне нужно, чтобы вывод был действительным Json. Ничего из этого main.Blockchain{Blocks:[]main.Block{main.Block{Index:1 недействительно Json.

pigfox 07.04.2019 22:25

Вывод действителен в формате JSON. Я отредактировал программу, чтобы упростить обнаружение JSON.

Bayta Darell 07.04.2019 22:46

Я вставил всю строку main.Blockchain{Blocks:[]main.Block{main.Block{Index:1, Timestamp:"2009-11-10 23:00:00", Data:... в jsonlint.com, и она просто загорелась ошибками.

pigfox 07.04.2019 23:04

@pigfox Программа печатает больше, чем JSON. Скопируйте и проверьте только JSON.

Bayta Darell 07.04.2019 23:40

Я заметил и исправил! @Cerise Limon - Спасибо!

pigfox 08.04.2019 03:09

Другие вопросы по теме