2017/03/03

[golang][雰囲気]スライス (2)

前回は、Go言語のスライス型だけ読んだ。
今回はスライスを読んで、終わりにしよう。

 

・・・あっさりした説明だった。


まずは、書いてあるとおりに実装してみよう。

01: package main
02: 
03: import "fmt"
04: 
05: func main() {
06:     a := [5]int{1, 2, 3, 4, 5}
07:     s := a[1:4]
08:     fmt.Printf("a=%s\n", a)
09:     fmt.Printf("s=%s\n", s)
10: }

結果

a=[%!s(int=1) %!s(int=2) %!s(int=3) %!s(int=4) %!s(int=5)]
s=[%!s(int=2) %!s(int=3) %!s(int=4)]

 

%sは「文字列またはスライスそのまま」らしい。
じゃあ、配列を%sで出力できると言うことは、配列もまたスライスに属するということだろうか。

いや、そもそも%sで文字列もスライスも配列も出力できるということは、%sは連続したメモリ領域を要素型に向けた出力形式で掃き出す、という意味を持つということか。
Cだと配列の要素数はsizeofでしかわからないし、文字列は\0で終わるというルールなので、こういうことはできなかったのだよな。

あ・・・・出力に「!」が入っているのは、エラーなのか。
つまり、エラーだけど出力してやったよ、ということなのか?
検索すると、%vというものがあるらしいので、変更して動かした。

a=[1 2 3 4 5]
s=[2 3 4]

うん、こっちの方が素直な出力だ。
ちなみに、%#vにするとこうなった。

a=[5]int{1, 2, 3, 4, 5}
s=[]int{2, 3, 4}

 

では、%sでスライスを出力できるというのは、なんなのだ?
英語版を見たけど、「the uninterpreted bytes of the string or slice」となっているので、

(the uninterpreted bytes of the string) || (slice)

だと読み取っているのだけど、もしかしたら、

the uninterpreted bytes of (the string || slice)

なのだろうか?

Google翻訳:「文字列またはスライスの解釈されていないバイト」
excite翻訳:「ストリングまたはスライスの解釈されていないバイト」
weblio英語翻訳:「ひもまたはスライスの解釈されてないバイト」
golang.jp:「文字列またはスライスそのまま」

うーん、こうやって並べると、or条件は「文字列かスライス」で、それにuninterpreted bytesがかかるというのが有力なのか。

では、私が最初に思ったように、orがスライスだけになるような文章はどういう書き方なのだろうか。

Google翻訳:「文字列の解釈されていないバイトまたはスライス」→uninterpreted byte or slice of string

えー、なんか違う気がする。。。
念のため、スライスをご飯にしてみよう。

Google翻訳:「文字列の解釈されていないバイトかライス」→uninterpreted byte or rice of string
Google翻訳:「文字列の解釈されていないバイトかご飯」→byte or rice not interpreted as a string

だんだん、何をしたかったのか分からなくなってきた。。

英語は、対象物を一番最後に置くような言語だったと思う。
SVCなり、SVOCなり。
だから、修飾する言葉が前にあって、その後ろにorで並んでいたら、その修飾はorしている両方にかかるということか。
もし、私が思ったように一部だけかかるようにしたいなら、orがまだ前に来るように並べるか、コンマで区切るとか、そういう対策をするんじゃなかろうか。

 

では、最初の疑問に戻って、%sだ。
Printf()で!が出力されるのはエラーということだが、%sでスライスを与えてもエラーになった。
では、%sで出力される文字列ではないスライスというのは、どういうものなのだろうか?

英語版の方では、%vを使った場合に、要素型に対応するフォーマットが書かれている。
%vでint型を表示しようとしたら、それは%dになりますよ、というような対応だ。
そこにはsliceが書かれていない。
もしかしたら、%sのsliceは、文字列のslice、つまり部分文字列を指しているだけなのだろうか?

 

また何か分かるのかもしれんが、集中してsliceのことを調べるのはここまでにしよう。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。