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

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

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

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

Q&A

解決済

1回答

4858閲覧

golang map[string][]*string について

horusu

総合スコア14

Go

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

0グッド

0クリップ

投稿2018/11/04 14:31

###不明点
・golangにおいて、map[string][]*stringが返り値の関数の作成方法

###現状
例えば、返り値がmap[string]*stringの場合であれば以下のように返せると思います。

func StringMap(src map[string]string) map[string]*string { dst := make(map[string]*string) for k, val := range src { v := val dst[k] = &v } return dst }

しかし、map[string][]*stringになった際、どのような関数になるのでしょうか?
引数をmap[string][]stringの場合でご教授頂けると幸いです。
お手数ですが、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

mapの値の型を分離して考えると良いでしょう

go

1type Strings []string 2type StrPointers []*string

と置くと、

この質問の課題は

「map[string]Strings から map[string]StrPointersへの変換」

と考えることができ、別途

「StringsからStrPointersへの変換」

ができれば全体を実装できると予想されます。

実際に書いてみた実装:
https://play.golang.org/p/NT4Z1eNB8-z

go

1package main 2 3import ( 4 "fmt" 5) 6 7type Strings []string 8type StrPointers []*string 9 10func StringsToStrPointers(s Strings) StrPointers { 11 res := make(StrPointers, 0, len(s)) 12 for _, v := range s { 13 value := v 14 res = append(res, &value) 15 } 16 return res 17} 18 19func StringMap(src map[string]Strings) map[string]StrPointers { 20 dst := map[string]StrPointers{} 21 for k, v := range src { 22 dst[k] = StringsToStrPointers(v) 23 } 24 return dst 25} 26 27func main() { 28 s := map[string]Strings{ 29 "hoge": Strings{"a", "b", "c"}, 30 "Hoge": Strings{"A", "B", "C"}, 31 } 32 for k, v := range StringMap(s) { 33 fmt.Printf("%q:", k) 34 for _, p := range v { 35 fmt.Printf("%s ", *p) 36 } 37 } 38}

投稿2018/11/05 00:01

nobonobo

総合スコア3367

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

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

horusu

2018/11/05 14:08

nobonoboさん何度もありがとうございます。。! 意図通りに行きましたが、基礎的な質問させてください。。。 >res := make(StrPointers, 0, len(s)) ですが、基本的に関数を前提とする場合に、要素数を0,容量をlen(s) とするのが、定石でしょうか??
nobonobo

2018/11/05 21:43

出力の長さ=入力の長さである場合に「メモリ確保」を1度で済ます方法のひとつです。他に以下のように要素数を予め確保してインデックスアクセスで代入するというのも良いと思います。 res := make(StrPointers, len(s)) for i := range s { res[i] = &s[i] }
nobonobo

2018/11/05 21:45

ちなみに、型を別名に置き換えてるのは必須ではありません。 mapの値型がどんなに複雑になっても切り分けて考えればよいということを体験してもらいたくてあえて置き換えてみました。
horusu

2018/11/07 14:03

遅くなりました。! なるほど。そんなやり方もあるのですね。。 ありがとうございます。! 機会があればまたお願いします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問