/home/by-natures/dev*

データ界隈で働くエンジニアとしての技術的なメモと、たまに普通の日記。

2018/10/29 異なる型のスライスの結合

先日、上野アメ横のセンタービル 地下食品街に行って仙草ゼリーを買ったのですが、店員さんが中国人だったので「你好」と言うと、「你好」を返してくれました。そのあとお会計の数字も聞き取れたし(920, 九十二)、一見無愛想なおじさんでしたが、最後に「谢谢你」と言ってもらえました。「谢谢」より少し丁寧な言い方のようです。

英語も中国語も、大学の時に勉強していたフランス語も、学ぶにつれて街中で役立つことが増えて生活が少し豊かになると実感します。

headlines.yahoo.co.jp

2つのスライスの結合

ある構造体と、それに移譲している別の構造体があって、それらのスライスを結合したかったのですが、うまくいかずに調べていました。簡略化すると以下の通りなのですが:

...
 5 type A interface{}
  6
  7 type X string
  8
  9 func main() {
 10         sliceA := make([]A, 0, 0)
 11         sliceX := []X{"x1", "x2"}
 12         var appendedSlice []A
 13         appendedSlice = append(sliceA, sliceX[0], sliceX[1])   // 動く
 14         appendedSlice = append(sliceA, sliceX...)  // 動かない。エラー: cannot use sliceX (type []X) as type []A in append
 15         fmt.Println(appendedSlice)
 16 }

14行目は13行目の構文糖だと思っていたのですが、型が異なる場合は挙動が異なるようです。

StackOverflow に質問したところ、回答が返ってきました:

stackoverflow.com

スライス同士が直接型変換されるようなケースは Go言語では許容していないようで、13行目のように個別に指定することを強制しているようです。例えば XA を実装しているので []X[]A に変換しようとしても、これも直接行うことはできずに、1つ1つ値を入れていくしかないようです。

回答の中で、以下の Go言語でよくある質問集をもらいましたので、あとで読んでみます。ありがたい。。

Frequently Asked Questions (FAQ) - The Go Programming Language

以下、参考に読んでいたページです。

stackoverflow.com

qiita.com

コマンドライン引数の処理

flag パッケージがありますが、他のプログラミング言語と大きく違いはなさそうです。

flag - The Go Programming Language

今回、変数をコマンドラインフラグで渡したかったので、同じフラグを複数回設定できる必要がありました。そのためにはフラグを受け取った時の処理を自分で書く必要があります。といってもインタフェースを実装するだけで、以下の StackOverflow の回答にも紹介されていました:

stackoverflow.com