바둑 배우기 시도 - 유령이 휴고에게 4

55162 단어 hugoghostgo

소개



여기 있습니다! 지난 몇 개의 게시물을 놓쳤다면 먼저 읽어보고 우리의 작은 프로토타입이 어떻게 진화했는지 감을 잡으시기 바랍니다. 이번에는 조금 정리하기 위해 리팩토링을 할 것입니다. 우리가 할 일의 대부분은 "데이터베이스"구조체에 메서드를 추가하는 것입니다.

방법



방법이란 무엇입니까? 음, 구조체에 연결된 함수로 생각할 수 있습니다. 또는 A Tour of Go의 표현대로

A method is a function with a special receiver argument.



우리 코드에는 struct GhostDatabase 가 있습니다. 수신자가 구조체인 다음 서명을 사용하여 메서드를 추가할 수 있습니다.

func (gd *GhostDatabase) getLength() int

그런 다음 다음을 사용하여 메서드를 호출할 수 있습니다.

var db GhostDatabase

...load JSON code here...

length := db.getLength()

자, 우리의 완전한 방법은 어떤 모습일까요? 우리가 적용할 대부분의 방법의 경우 추론하기가 매우 쉽습니다.

func (gd *GhostDatabase) getLength() int {
    return len(gd.Db[0].Data.Posts)
}

많은 방법



이제 몇 가지 유용한 방법을 빠르게 제거해 보겠습니다. 대부분의 경우 주석에 적힌 대로 수행하므로 각각에 대해 자세히 설명하지 않겠습니다.

func (gd *GhostDatabase) getMobiledoc(i int) string {
    return gd.Db[0].Data.Posts[i].Mobiledoc
}

func (gd *GhostDatabase) getPostId(i int) string {
    return gd.Db[0].Data.Posts[i].ID
}

func (gd *GhostDatabase) getPostTitle(i int) string {
    return gd.Db[0].Data.Posts[i].Title
}

func (gd *GhostDatabase) getPostSlug(i int) string {
    return gd.Db[0].Data.Posts[i].Slug
}

func (gd *GhostDatabase) getPostStatus(i int) string {
    return gd.Db[0].Data.Posts[i].Status
}

func (gd *GhostDatabase) getPostCreatedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].CreatedAt
}

func (gd *GhostDatabase) getPostUpdatedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].UpdatedAt
}

func (gd *GhostDatabase) getPostPublishedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].PublishedAt
}

func (gd *GhostDatabase) getPostFeatureImage(i int) string {
    return gd.Db[0].Data.Posts[i].FeatureImage
}

태그



지금까지 살펴보지 않은 한 가지는 게시물과 관련된 태그를 검색하는 것입니다. 우리는 지금 방법을 추가하는 작업을 하고 있으므로 이를 해결하기에 좋은 시기입니다. 우리가 해야 할 일을 통해 이야기합시다.

먼저 게시물 태그의 "데이터베이스"를 순환해야 합니다. 여기에서 PostID 필드가 게시물 ID(pid )와 일치하는지 확인하고 함수에 전달합니다. 그런 다음 태그 ID를 변수tagId에 할당합니다.

다음으로 우리는 Tags "데이터베이스"를 통해 우리의 방식을 반복하고 현재 태그 ID가 tagId와 일치하는지 확인합니다. 일치하는 항목이 있으면 슬라이스r에 태그 이름을 추가합니다. 완료되면 r로 돌아갑니다.

실제로 어떻게 보이는지 봅시다.

func (gd *GhostDatabase) getTags(pid string) []string {
    var r []string
    for i := 0; i < len(gd.Db[0].Data.PostsTags); i++ {
        if gd.Db[0].Data.PostsTags[i].PostID == pid {
            tagId := gd.Db[0].Data.PostsTags[i].TagID
            for j := 0; j < len(gd.Db[0].Data.Tags); j++ {
                if gd.Db[0].Data.Tags[j].ID == tagId {
                    r = append(r, gd.Db[0].Data.Tags[j].Name)
                }
            }
        }
    }
    return r
}

초라하지 않습니다.

다음번



이것이 현재 우리의 모든 방법입니다. 그것들을 제거하면 실제로 Markdown 파일 작성을 시작하는 데 필요한 모든 부분이 있다고 생각합니다!



이 게시물을 즐기십니까?


How about buying me a coffee?




신다쿤 / atlg


dev.to에 올린 "Attempting to Learn Go" 게시물의 소스 저장소





Go 배우기 시도


여기에서 내가 작성하고 게시한 Go 학습 시도 게시물에 대해 작성한 코드를 찾을 수 있습니다.

포스트 색인



게시하다
암호



-

-

-

-

-

src

src

src

src

src

src

src

src

src

src

src

src

src

src

src

위 코드 참조





View on GitHub



코드 목록




package main

import (
    "encoding/json"
    "fmt"
    "io"
    "os"
    "reflect"
    "strconv"
    "strings"
    "time"
)

type GhostDatabase struct {
    Db []struct {
        Meta struct {
            ExportedOn int64 `json:"exported_on"`
            Version string `json:"version"`
        } `json:"meta"`
        Data struct {
            Posts []struct {
                ID string `json:"id"`
                UUID string `json:"uuid"`
                Title string `json:"title"`
                Slug string `json:"slug"`
                Mobiledoc string `json:"mobiledoc"`
                HTML string `json:"html"`
                CommentID string `json:"comment_id"`
                Plaintext string `json:"plaintext"`
                FeatureImage string `json:"feature_image"`
                Featured int `json:"featured"`
                Type string `json:"type"`
                Status string `json:"status"`
                Locale interface{} `json:"locale"`
                Visibility string `json:"visibility"`
                EmailRecipientFilter string `json:"email_recipient_filter"`
                AuthorID string `json:"author_id"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
                PublishedAt time.Time `json:"published_at"`
                CustomExcerpt interface{} `json:"custom_excerpt"`
                CodeinjectionHead interface{} `json:"codeinjection_head"`
                CodeinjectionFoot interface{} `json:"codeinjection_foot"`
                CustomTemplate interface{} `json:"custom_template"`
                CanonicalURL interface{} `json:"canonical_url"`
            } `json:"posts"`
            PostsAuthors []struct {
                ID string `json:"id"`
                PostID string `json:"post_id"`
                AuthorID string `json:"author_id"`
                SortOrder int `json:"sort_order"`
            } `json:"posts_authors"`
            PostsMeta []interface{} `json:"posts_meta"`
            PostsTags []struct {
                ID string `json:"id"`
                PostID string `json:"post_id"`
                TagID string `json:"tag_id"`
                SortOrder int `json:"sort_order"`
            } `json:"posts_tags"`
            Roles []struct {
                ID string `json:"id"`
                Name string `json:"name"`
                Description string `json:"description"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
            } `json:"roles"`
            RolesUsers []struct {
                ID string `json:"id"`
                RoleID string `json:"role_id"`
                UserID string `json:"user_id"`
            } `json:"roles_users"`
            Settings []struct {
                ID string `json:"id"`
                Group string `json:"group"`
                Key string `json:"key"`
                Value string `json:"value"`
                Type string `json:"type"`
                Flags interface{} `json:"flags"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
            } `json:"settings"`
            Tags []struct {
                ID string `json:"id"`
                Name string `json:"name"`
                Slug string `json:"slug"`
                Description interface{} `json:"description"`
                FeatureImage interface{} `json:"feature_image"`
                ParentID interface{} `json:"parent_id"`
                Visibility string `json:"visibility"`
                OgImage interface{} `json:"og_image"`
                OgTitle interface{} `json:"og_title"`
                OgDescription interface{} `json:"og_description"`
                TwitterImage interface{} `json:"twitter_image"`
                TwitterTitle interface{} `json:"twitter_title"`
                TwitterDescription interface{} `json:"twitter_description"`
                MetaTitle interface{} `json:"meta_title"`
                MetaDescription interface{} `json:"meta_description"`
                CodeinjectionHead interface{} `json:"codeinjection_head"`
                CodeinjectionFoot interface{} `json:"codeinjection_foot"`
                CanonicalURL interface{} `json:"canonical_url"`
                AccentColor interface{} `json:"accent_color"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
            } `json:"tags"`
            Users []struct {
                ID string `json:"id"`
                Name string `json:"name"`
                Slug string `json:"slug"`
                Password string `json:"password"`
                Email string `json:"email"`
                ProfileImage string `json:"profile_image"`
                CoverImage interface{} `json:"cover_image"`
                Bio interface{} `json:"bio"`
                Website interface{} `json:"website"`
                Location interface{} `json:"location"`
                Facebook interface{} `json:"facebook"`
                Twitter interface{} `json:"twitter"`
                Accessibility string `json:"accessibility"`
                Status string `json:"status"`
                Locale interface{} `json:"locale"`
                Visibility string `json:"visibility"`
                MetaTitle interface{} `json:"meta_title"`
                MetaDescription interface{} `json:"meta_description"`
                Tour interface{} `json:"tour"`
                LastSeen time.Time `json:"last_seen"`
                CreatedAt time.Time `json:"created_at"`
                UpdatedAt time.Time `json:"updated_at"`
            } `json:"users"`
        } `json:"data"`
    } `json:"db"`
}

type Mobiledoc struct {
    Version string `json:"version"`
    Markups []interface{} `json:"markups"`
    Atoms []interface{} `json:"atoms"`
    Cards [][]interface{} `json:"cards"`
    Sections [][]interface{} `json:"sections"`
    GhostVersion string `json:"ghostVersion"`
}

func (gd *GhostDatabase) getLength() int {
    return len(gd.Db[0].Data.Posts)
}

func (gd *GhostDatabase) getMobiledoc(i int) string {
    return gd.Db[0].Data.Posts[i].Mobiledoc
}

func (gd *GhostDatabase) getPostId(i int) string {
    return gd.Db[0].Data.Posts[i].ID
}

func (gd *GhostDatabase) getPostTitle(i int) string {
    return gd.Db[0].Data.Posts[i].Title
}

func (gd *GhostDatabase) getPostSlug(i int) string {
    return gd.Db[0].Data.Posts[i].Slug
}

func (gd *GhostDatabase) getPostStatus(i int) string {
    return gd.Db[0].Data.Posts[i].Status
}

func (gd *GhostDatabase) getPostCreatedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].CreatedAt
}

func (gd *GhostDatabase) getPostUpdatedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].UpdatedAt
}

func (gd *GhostDatabase) getPostPublishedAt(i int) time.Time {
    return gd.Db[0].Data.Posts[i].PublishedAt
}

func (gd *GhostDatabase) getPostFeatureImage(i int) string {
    return gd.Db[0].Data.Posts[i].FeatureImage
}

func (gd *GhostDatabase) getTags(pid string) []string {
    var r []string
    for i := 0; i < len(gd.Db[0].Data.PostsTags); i++ {
        if gd.Db[0].Data.PostsTags[i].PostID == pid {
            tagId := gd.Db[0].Data.PostsTags[i].TagID
            for j := 0; j < len(gd.Db[0].Data.Tags); j++ {
                if gd.Db[0].Data.Tags[j].ID == tagId {
                    r = append(r, gd.Db[0].Data.Tags[j].Name)
                }
            }
        }
    }
    return r
}

func main() {
    fmt.Println("ghost2hugo")

    file, err := os.Open("shindakun-dot-net.ghost.2022-03-18-22-02-58.json")
    if err != nil {
        fmt.Println(err)
    }

    defer file.Close()

    b, err := io.ReadAll(file)
    if err != nil {
        fmt.Println(err)
    }

    var db GhostDatabase

    err = json.Unmarshal(b, &db)
    if err != nil {
        fmt.Println(err)
    }

    for i := 0; i < db.getLength(); i++ {
        fmt.Println(db.getPostTitle(i))
        fmt.Println(db.getPostSlug(i))
        fmt.Println(db.getPostStatus(i))
        fmt.Println(db.getPostCreatedAt(i))
        fmt.Println(db.getPostUpdatedAt(i))
        fmt.Println(db.getPostPublishedAt(i))
        fmt.Println(db.getPostFeatureImage(i))

        id := db.getPostId(i)
        tags := db.getTags(id)
        fmt.Println(tags)

        c := strings.ReplaceAll(db.getMobiledoc(i), "`", "%'")
        cc := "`" + c + "`"

        ucn, err := strconv.Unquote(cc)
        if err != nil {
            fmt.Println(err, ucn)
        }

        ucn = strings.ReplaceAll(ucn, "%'", "`")

        var md Mobiledoc

        err = json.Unmarshal([]byte(ucn), &md)
        if err != nil {
            fmt.Println(err)
        }

        if reflect.ValueOf(md.Cards).Len() > 0 {
            card := md.Cards[0][1]
            bbb := card.(map[string]interface{})

            fmt.Println(bbb["markdown"])
        }

        fmt.Println("---")
    }
}

좋은 웹페이지 즐겨찾기