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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Go

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

Q&A

解決済

1回答

1625閲覧

Go言語のmapでレコード追加

menshan

総合スコア54

Go

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

0グッド

0クリップ

投稿2016/06/13 23:06

Go言語のmapでレコード追加したいのですが実行時エラーになってしまいうまくできません。
C++で行っている以下処理をGoでも行いたいのですがスマートな方法はどのようにするのがいいのでしょうか?

c++

1#include <map> 2#include <iostream> 3 4using namespace std; 5 6class DataOneDay { 7public: 8 int bgn1; 9 int end1; 10}; 11 12int main() { 13 14 map<int, map<int, DataOneDay> > list1; 15 int no = 1; 16 int tm1 = 2; 17 int tm2 = 3; 18 19 list1[no][tm2].bgn1 = tm2; 20 list1[no][tm2].end1 = tm1; 21 22 for(map<int, map<int, DataOneDay> >::iterator i = list1.begin(); i != list1.end(); i++){ 23 for(map<int, DataOneDay> ::iterator j = i->second.begin(); j != i->second.end(); j++){ 24 cout 25 << j->first << " " 26 << j->second.bgn1 << " " 27 << j->second.end1 << endl; 28 } 29 } 30 return 0; 31} 32 33

これをGoにすると以下の様になるかと思うのですが、どのように変更すればいいでしょうか?

Go

1package main 2 3import ( 4 "fmt" 5) 6 7type DataOneDay struct { 8 bgn1 int 9 end1 int 10} 11 12func main() { 13 14 var list1 map[int]map[int]DataOneDay 15 var rec2 map[int]DataOneDay 16 var rec1 DataOneDay 17 no := 1 18 tm1 := 2 19 tm2 := 3 20 21 list1[no] = rec2 22 list1[no][tm2] = rec1 23 24 rec1 = list1[no][tm2] 25 rec1.end1 = tm1 26 rec1.bgn1 = tm1 27 list1[no][tm2] = rec1 28 29 for key1,value1 := range list1 { 30 for key2,value2 := range value1 { 31 fmt.Printf("%d %d %d\n", key1, value2.bgn1, value2.end1) 32 } 33 } 34} 35

エラーメッセージは以下になります。

panic: assignment to entry in nil map goroutine 1 [running]: panic(0x80e9460, 0x1830a108) /usr/local/go/src/runtime/panic.go:481 +0x326 main.main() /home/user01/golang/hello/str3.go:21 +0x7e exit status 2

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

list1rec2も中身が無いので、
assignment to entry in nil map(nilマップのエントリーへの代入)
というエラーになっています。

make関数で中身を作りましょう。
型表記が冗長になるので、型推論を使いましょう。

lang

1list1 := make(map[int]map[int]DataOneDay) 2rec2 := make(map[int]DataOneDay)

投稿2016/06/14 07:38

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

menshan

2016/06/15 15:35

解答有り難うございます。 GO言語はまだ、1行書くたびにググっている状態ですが、 目をつぶっても書けるようにがんばります。
argius

2016/06/15 15:43

実は私もGoはそれほど熟練ではないので、リファレンスは手放せません。 お互いがんばりましょう(^-^)/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問