len()
goでは文字列、配列、map、スライス、チャネルの要素の数をlen()という関数で取得できるようです。
for i := 0; i < len(a); i++ { ... }
* UTF-8のときは一文字ずつになるのでしょうか。たぶんなるのでしょう。
組み込み関数と書かれていますが、実際はどうなっているのか不明です。
sizeof的組み込み関数なのでしょう。
len()実験
簡単に、lenの動きを見てみました。package main
import (
"fmt"
)
func main() {
var a[16]uint;
fmt.Printf("len(a)=%d\n",len(a))
str := "12345678901234567890"
fmt.Printf("len(str)=%d\n",len(str))
}
結果は
$ ./8.out len(a)=16 len(str)=40アレ? UTF8はバイト数ででてますね。 ということはこれsizeofと同じということのようです。 あと、文字列の最後にnullとかはあるのかもしれないけど入ってないと。
range
おそらくは、このlen()を内部でつかっているrangeという指定ができてfor i, v := range a { ... }
こんな書き方でforeachになる、と。
foreach気持ち悪いけどfor i:=0;i< sizeof(a);i++ はオッケーという
Cっぽい思想をよく汲んでいると思います。
今っぽい書き方をさせつつもアセンブラを意識できる記述なのかな。
よくできている。
しかし今時の人に受けるのかな。そこはわかりません。
rangeと文字列
rangeを文字列で使うサンプルを書いてみました。package main
import (
"fmt"
)
func main() {
str := "12345678901234567890"
for v := range str {
fmt.Printf("%c\n",v)
}
}
こちらも普通にbyteで処理されちゃいますね。
$ ./8.out ! " # $ % & '
ひどいす。
まあきっとなにか、文字列用の関数とかあるのでしょう。
0 件のコメント:
コメントを投稿