바둑 배우기 시도 - 유령이 휴고에게 4
소개
여기 있습니다! 지난 몇 개의 게시물을 놓쳤다면 먼저 읽어보고 우리의 작은 프로토타입이 어떻게 진화했는지 감을 잡으시기 바랍니다. 이번에는 조금 정리하기 위해 리팩토링을 할 것입니다. 우리가 할 일의 대부분은 "데이터베이스"구조체에 메서드를 추가하는 것입니다.
방법
방법이란 무엇입니까? 음, 구조체에 연결된 함수로 생각할 수 있습니다. 또는 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("---")
}
}
Reference
이 문제에 관하여(바둑 배우기 시도 - 유령이 휴고에게 4), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/shindakun/attempting-to-learn-go-ghost-to-hugo-4-4i2p
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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("---")
}
}
Reference
이 문제에 관하여(바둑 배우기 시도 - 유령이 휴고에게 4), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/shindakun/attempting-to-learn-go-ghost-to-hugo-4-4i2p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)