Хранение структурных деревьев на диске - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующая структура:

type Post struct {
  Id    int
  Name  string
  Text  string
  Posts []Post
}

Чтобы добавить некоторые данные, я делаю следующее:

var posts []Post

posts = append(posts, Post{Id: 0, Name: "a", Text: "b"})
posts[0].Posts = append(posts[0].Posts, Post{Id: 1, Name: "c", Text: "d"})

posts = append(posts, Post{Id: 2, Name: "e", Text: "f"})
posts[0].Posts = append(posts[0].Posts, Post{Id: 3, Name: "h", Text: "d"})

Как эффективно сохранить это дерево структуры на диске?Я ищу что-то, что можно использовать без сервера (например, SQLite).Я хотел бы иметь возможность искать Id 2 или 3, возвращая всю структуру с Id 2 или 3, соответственно.Кроме того, я хотел бы иметь возможность обновить одну структуру, например, с помощью Id 2.

Кроме того, было бы лучше использовать карту, используя Id в качестве ключа карты?

1 Ответ

0 голосов
/ 02 октября 2018

Используйте кодировку / gob, чтобы поместить двоичные данные в файл или вывести их снова

import (
    "bufio"
    "encoding/gob"
    "fmt"
    "os"
)

type Post struct {
    Id    int
    Name  string
    Text  string
    Posts []Post
}

func main() {

    var posts []Post

    posts = append(posts, Post{Id: 0, Name: "a", Text: "b"})
    posts[0].Posts = append(posts[0].Posts, Post{Id: 1, Name: "c", Text: "d"})

    posts = append(posts, Post{Id: 2, Name: "e", Text: "f"})
    posts[0].Posts = append(posts[0].Posts, Post{Id: 3, Name: "h", Text: "d"})
    fmt.Printf("%v\n", posts)

    path := "post.gob"

    // write
    out, err1 := os.Create(path)
    if err1 != nil {
        fmt.Printf("File write error: %v\n", err1)
        os.Exit(1)
    }
    w := bufio.NewWriter(out)
    enc := gob.NewEncoder(w)
    enc.Encode(posts)
    w.Flush()
    out.Close()

    // read
    b := make([]Post, 10)
    in, err2 := os.Open(path)
    if err2 != nil {
        fmt.Printf("File read error: %v\n", err2)
        os.Exit(1)
    }
    r := bufio.NewReader(in)
    dec := gob.NewDecoder(r)
    dec.Decode(&b)

    fmt.Printf("%v\n", b)

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