先日、上野アメ横のセンタービル 地下食品街に行って仙草ゼリーを買ったのですが、店員さんが中国人だったので「你好」と言うと、「你好」を返してくれました。そのあとお会計の数字も聞き取れたし(920, 九十二)、一見無愛想なおじさんでしたが、最後に「谢谢你」と言ってもらえました。「谢谢」より少し丁寧な言い方のようです。
英語も中国語も、大学の時に勉強していたフランス語も、学ぶにつれて街中で役立つことが増えて生活が少し豊かになると実感します。
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 に質問したところ、回答が返ってきました:
スライス同士が直接型変換されるようなケースは Go言語では許容していないようで、13行目のように個別に指定することを強制しているようです。例えば X
は A
を実装しているので []X
を []A
に変換しようとしても、これも直接行うことはできずに、1つ1つ値を入れていくしかないようです。
回答の中で、以下の Go言語でよくある質問集をもらいましたので、あとで読んでみます。ありがたい。。
Frequently Asked Questions (FAQ) - The Go Programming Language
以下、参考に読んでいたページです。
コマンドライン引数の処理
flag パッケージがありますが、他のプログラミング言語と大きく違いはなさそうです。
flag - The Go Programming Language
今回、変数をコマンドラインフラグで渡したかったので、同じフラグを複数回設定できる必要がありました。そのためにはフラグを受け取った時の処理を自分で書く必要があります。といってもインタフェースを実装するだけで、以下の StackOverflow の回答にも紹介されていました: