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

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

ただいまの
回答率

90.50%

  • Go

    651questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Go初心者です。mapの配列?のなかから要素を取り出すことができません。

解決済

回答 1

投稿 編集

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

yutaro1204

score 0

前提・実現したいこと

Goで現在の天気を返すCUIを作りたいとおもっています。

例:
cmd上で
weather.exe today
と打つと、
Weather in Tokyo: Cloud
みたいな感じで返してきてほしいです。

発生している問題・エラーメッセージ

Goからhttpでhttps://openweathermap.org/からgetしてきた天気の情報セットから上手く自分の欲しいデータを抽出できないでいます。
具体的には、以下の形式のデータを取得することができましたが、その中の要素をうまく取れません。

[map[id:801 main:Clouds description:few clouds icon:02d]]

該当のソースコード

package main

import (
    "github.com/mitchellh/cli"
    "os"
    "io"
    "fmt"
    "net/http"
    "io/ioutil"
    "encoding/json"
)
type TestCommand struct {}
func (c *TestCommand) Run(args []string) int {
    fmt.Println("you typed test")
    resp, _ := http.Get("http://api.openweathermap.org/data/2.5/weather?q=Tokyo,jp&APPID={apikey}")
    defer resp.Body.Close()
    byteArray, _ := ioutil.ReadAll(resp.Body)
    var weather interface{}
    json.Unmarshal(byteArray, &weather)
    fmt.Println(weather.(map[string]interface{})["weather"]) // [map[id:801 main:Clouds description:few clouds icon:02d]]
    return 0
}
func (c *TestCommand) Synopsis() string {
    return "Test"
}
func (c *TestCommand) Help() string {
    return "Usage: isay goodbye"
}
func main() {
    c := cli.NewCLI("isay", "0.0.1")

    c.Args = os.Args[1:]
    c.Commands = map[string]cli.CommandFactory{
        "hello": func() (cli.Command, error) {
            return &HelloCommand{}, nil
        },
        "goodbye": func() (cli.Command, error) {
            return &GoodbyeCommand{}, nil
        },
        "test": func() (cli.Command, error) {
            return &TestCommand{}, nil
        },
    }
    exitStatus, err := c.Run()
    if err != nil {
        fmt.Println(err)
    }
    os.Exit(exitStatus)
}

ちなみに、APIで返ってくるデータは、以下のような形式です。

{
"coord": {
"lon": 139.76,
"lat": 35.68
},
"weather": [
  {
"id": 801,
"main": "Clouds",
"description": "few clouds",
"icon": "02d"
}
],
"base": "stations",
"main": {
"temp": 281.15,
"pressure": 1010,
"humidity": 26,
"temp_min": 281.15,
"temp_max": 281.15
},
"visibility": 10000,
"wind": {
"speed": 6.7,
"deg": 300,
"gust": 13.4
},
"clouds": {
"all": 20
},
"dt": 1549000800,
"sys": {
"type": 1,
"id": 8077,
"message": 0.0064,
"country": "JP",
"sunrise": 1548970884,
"sunset": 1549008478
},
"id": 1850147,
"name": "Tokyo",
"cod": 200
}

試したこと

https://qiita.com/hisayatanaka/items/6f0bb04f5e0d07775b87
上のURLを参考にして、返ってきたjsonをパースしてから以下のようにしてデータを取り出そうとしましたが、できませんでした。

fmt.Println(weather.(map[string]interface{})["weather"].(map[string]interface{})["main"])


interface{}で取り出しているからか、index指定で出すこともできないようで、よくわかっていません。
Goは今日からやり始めました。

もしよろしければ改善方法を教えていただければ幸いです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

map[base:stations main:map[temp:274.8 pressure:1015 humidity:38 temp_min:272.25 temp_max:277.15] visibility:10000 dt:1.5490224e+09 name:Tokyo cod:200 coord:map[lon:139.76 lat:35.68] weather:[map[main:Clouds description:few clouds icon:02n id:801]] wind:map[speed:7.7 deg:330] clouds:map[all:20] sys:map[country:JP sunrise:1.548970873e+09 sunset:1.549008493e+09 type:1 id:8074 message:0.0087] id:1.850147e+06]


上記のようなデータは、以下のように取得できるようです。
(ここではweather配下のmainを取得している)

fmt.Println(weather.(map[string]interface{})["weather"].([]interface{})[0].(map[string]interface{})["main"])

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Go

    651questions

    Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。