2010年2月27日土曜日

型について その3 len()とrange

goのチュートリアル、型についての続きです。

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 件のコメント:

コメントを投稿