前回は、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。