質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

ストラクトで受け取った値を別のストラクトに受け渡すには?

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,235
退会済みユーザー

退会済みユーザー

このストラクトにjsonで返ってきた値をしたのストラクトに当てはめ、値を更新したい.
ちょっとでもわかる人いたらお願いします。本当至急です。
本当にわからないのでお願いします。
※実際のコードとは少し異なります。

一番上のストラクトにデータがゲットから取得され、それを、二番目のリクエストボディーに移したいのですがやり方がわかりません。
そのリクエストボディーを使ってアップデートファンクション(一番下)を行いたいのですが、技術が足りず、前に進めなくなってしまいました。
コメントも入っているので、そちらも読んでいただけたらと思います。

type PostView struct {
    Id                      int64           `json:"id"`
    UserId                  int64           `json:"userid"`
    GroupId                 int64           `json:"groupid"`
        Title                   string          `json:"title"`
        Content                 string          `json:"content"`
        Comment                 string          `json:"comment"`
        PostFile                sql.NullString  `json:"postfile"`
        Time                    int             `json:"time"`
    CreatedAt               *time.Time      `json:"createdAt"`
    UpdatedAt               *time.Time      `json:"updatedAt"`
}
type PostRequestBody struct {
    Title  string
    Content string
    Comment string
    PostFile string
    Time     int
}
func (p *PostRequestBody) FieldMap(req *http.Request) binding.FieldMap {
    return binding.FieldMap{
        &p.Title:           "title",
        &p.Content:         "content",
        &p.Comment:         "comment",
        &p.PostFile:        "postfile",
        &p.Time:            "time",
    }
}
func GetPost(postId int64) PostView {
    query := PostQuery + `
        WHERE p.id = ?
    `

    var post PostView
    err := DbMap.SelectOne(&post, query, postId)
    helpers.CheckErr(err, "Executing query failed")

    return post
}
func UpdatePost(post Post) Post {
    trans, err := DbMap.Begin()
    helpers.CheckErr(err, "Start new transaction failed")

    now := time.Now()
    post.UpdatedAt = &now

    _, err = trans.Update(&post)
    CheckTransErr(trans, err, "Update post failed")

    err = trans.Commit()
    CheckTransErr(trans, err, "Commit transaction failed")

    return post
}
func UpdatePost(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
    userId, err := strconv.ParseInt(ps.ByName("userId"), 10, 0)
    helpers.CheckErr(err, "Invalid userId")
    postId, err := strconv.ParseInt(ps.ByName("postId"), 10, 0)
    helpers.CheckErr(err, "Invalid postId")


    user := models.GetUser(userId)
    log.Println(user)

    switch user.GroupId {
    case 1:

        p := models.GetPost(postId)
//取得したpostが入ってきている。
//でも、getpostはstructが違うためbiningできない
//それをどうにかして、bindし、変更を加えたい。

//p := new(models.PostRequestBody)//新しいのを作ることができる
        errs := binding.Bind(req, p)
        if errs.Len() > 0 {
            log.Println(errs)
            R.JSON(w, 422, errs)
            return
        }

        post := models.Post{
                        Title: p.Title,
            Content:  p.Content,
                        Comment: p.Comment,
                        PostFile: sql.NullString{
                          Valid: len(p.PostFile) > 0,
                          String: p.PostFile,
},
            Time:    p.Time,
        }
        R.JSON(w, http.StatusOK, models.UpdatePost(post))
    default:
        R.JSON(w, http.StatusBadRequest, map[string]interface{}{
            "code":    http.StatusBadRequest,
            "message": http.StatusText(http.StatusBadRequest),
        })

    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2016/09/27 19:32

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 1

0

struct を内包する事でそのまま Unmarshal 出来ます。

package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "log"
    "os"
    "time"
)

type PostRequestBody struct {
    Title    string         `json:"title"`
    Content  string         `json:"content"`
    Comment  string         `json:"comment"`
    PostFile sql.NullString `json:"postfile"`
    Time     int            `json:"time"`
}

type PostView struct {
    PostRequestBody

    Id      int64 `json:"id"`
    UserId  int64 `json:"userid"`
    GroupId int64 `json:"groupid"`

    CreatedAt *time.Time `json:"createdAt"`
    UpdatedAt *time.Time `json:"updatedAt"`
}

func main() {
    f, err := os.Open("foo.json")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    var p PostView
    err = json.NewDecoder(f).Decode(&p)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(p.Content)
    // PostRequestBody として欲しいならば
    fmt.Println(p.PostRequestBody.Content)
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 20:07

    てか退会済みユーザw

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る