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

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

ただいまの
回答率

88.04%

Goのスライス部分で解決がしたい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 503

score 4

Goのスライス部分で解決がしたい&DataStoreに表示させたい

こんにちは

Goのスライスでリクエストを複数表示する事ができたのでGoogleCloudPlatFormのdatastoreで

URLs.ID URLs.URL URLs.ShotenURL USERID
atssd https://golang.org/pkg/net/http/1 test/atssd aaaaaaa
YyySj https://golang.org/pkg/net/http/2 test/YyySj aaaaaaa
Yfsaf https://golang.org/pkg/net/http/3 test/Yfsaf aaaaaaa

と表示させたいのですが、deployしてPOSTすると

URLs.ID URLs.URL URLs.ShotenURL USERID
["atssd","YyySj","Yfsaf"] ["https://golang.org/pkg/net/http/1","https://golang.org/pkg/net/http/2","https://golang.org/pkg/net/http/3"] ["test/atssd","test/YyySj","test/Yfsaf"] aaaaaaa

と出てきてしまいます。
配列のAppendの部分で配列毎に入れてないのが原因だと思うのですが、配列毎に入れるのが分かりません
アドバイスの方を検討お願いします

リクエスト

{
    "url": [
                      "https://golang.org/pkg/net/http/1",
                      "https://golang.org/pkg/net/http/2",
                      "https://golang.org/pkg/net/http/3"
           ],
    "userId":"aaaaaaa"
}

レスポンス

{
   "result": "success",
   "hoge" : [
             {
               "id": "atssd",
               "url": "https://golang.org/pkg/net/http/1",
               "shortenUrl": "test/atssd",
             },
             {
               "id": "YyySj",
               "url": "https://golang.org/pkg/net/http/2",
               "shortenUrl": "test/Yyysj",
             } ,
             {
               "id": "Yfsaf",
               "url": "https://golang.org/pkg/net/http/3",
               "shortenUrl": "test/Yfsaf",
             } 
            ]

   "userId": "aaaaaaa"
}

該当のソースコード

package main

import (
    "context"
    "encoding/json"
    "html/template"
    "io/ioutil"
    "math/rand"
    "net/http"
    "net/url"
    "os"
    "path"
    "strings"
    "time"
    "fmt"
    "encoding/base64"
    // "bytes"
    // "io"

    "github.com/go-chi/chi"
    "github.com/go-chi/chi/middleware"
    "github.com/mjibson/goon"
    "github.com/skip2/go-qrcode"
    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"
    "google.golang.org/appengine/log"
    "google.golang.org/appengine/urlfetch"

    "google.golang.org/appengine/user"

)
type ShortURLs_API struct{
    Result string `json:"result"`
    URLs []URLs `json:"urls"`
    USERID string `json:"userId"`
}

type URLs struct{
    ID string `datastore:"-" json:"id" goon:"id"`
    URLstring string `json:"urlstring"`
    ShortenURL string `json:"shortenUrl"`
}

func main() {
    var err error
    baseURL, err = url.Parse(os.Getenv("BASE_URL"))
    if err != nil {
        panic("base URL is invalid")
    }
    r := chi.NewRouter()
    r.Use(middleware.RequestID)
    r.Use(middleware.RealIP)
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(middleware.Timeout(60 * time.Second))

    r.Post("/short-urls-apis",PostRequest4)

    appengine.Main()
}

func randomID(n int) string {
    b := make([]rune, n)
    for i := range b {
        b[i] = letters[rand.Intn(len(letters))]
    }
    return string(b)
}

func PostRequests(w http.ResponseWriter, r *http.Request){
    ctx := appengine.NewContext(r)
    body, err := ioutil.ReadAll(r.Body)
    if err != nil {
         fmt.Println("io error")
         return
    }
    //url := r.FormValue("url")
    userId := r.FormValue("userId")
    //goon := goon.NewGoon(r)
    log.Infof(ctx, "--aaaaaa--")
    data_URL:=[]URLs{}
    goon := goon.NewGoon(r)
    //Test00:=make([]URLs,0,5)
    for i:=0; i<10;i++{
        //for _, url := range Test00{ 
        id := randomID(5)
        log.Infof(ctx, "--bbbbbb--")

        for {
            data_URL := &URLs{ID: id}
            //test := &URLs{ID:id}
            if err := goon.Get(data_URL); err != nil {
                if err == datastore.ErrNoSuchEntity {
                    //log.Infof(ctx, "--cccccc--")
                    break
                }
            }
            id = randomID(5)
        }
        data_URL = append(data_URL,URLs{
            ID[i]:id,
            //URLstring:URLstring,
            ShortenURL:"test/"+id,
        },)

        log.Infof(ctx,data_URL[i].ID)
        log.Infof(ctx,data_URL[i].URLstring)
        log.Infof(ctx,data_URL[i].ShortenURL)

    }

    data:= &ShortURLs_API{
        Result:"OK",
        URLs:data_URL,
        USERID:userId,
    }

    log.Infof(ctx,data.URLs[0].ID)
    log.Infof(ctx,data.URLs[0].ShortenURL)
    log.Infof(ctx,data.URLs[0].URLstring)


    err = json.Unmarshal(body, &data)
    if err != nil {
        err = json.Unmarshal(body,&data)
        http.Error(w, err.Error(), 500)
        return
    }
    log.Infof(ctx,data.URLs[0].ID)
    log.Infof(ctx,data.URLs[0].ShortenURL)
    log.Infof(ctx,data.URLs[0].URLstring)


    output, err := json.Marshal(data)
        if err != nil {
            http.Error(w, err.Error(), 500)
            return
        }
    w.Header().Set("content-type", "application/json")
    w.Write(output)

    _, err = goon.Put(data)
    if err != nil {
        w.WriteHeader(http.StatusInternalServerError)
        return
    }

}

補足情報(FW/ツールのバージョンなど)

runtime: go111

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

新しいループを作ってその中にPutを入れて回したらできました

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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