golangでのstringへのアクセス

golangでstringへとindex or rangeでアクセスした時の型とindexと数値を調べた

package main

import (
    "fmt"
)

func main() {
    s := "hello 日本語"
    fmt.Println("index, access")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%T ", s[i])
        fmt.Println(i, s[i], string(s[i]))
    }
    fmt.Println("\nrange access")
    for i, v := range s {
        fmt.Printf("%T ", v)
        fmt.Println(i, v, string(v))
    }
    fmt.Println("\nちなchrっぽいアレ")
    c := 'A'
    fmt.Printf("%T ", c)
    fmt.Println(c, string(c))
}

これが

index, access
uint8 0 104 h
uint8 1 101 e
uint8 2 108 l
uint8 3 108 l
uint8 4 111 o
uint8 5 32  
uint8 6 230 æ
uint8 7 151 
uint8 8 165 ¥
uint8 9 230 æ
uint8 10 156 
uint8 11 172 ¬
uint8 12 232 è
uint8 13 170 ª
uint8 14 158 

range access
int32 0 104 h
int32 1 101 e
int32 2 108 l
int32 3 108 l
int32 4 111 o
int32 5 32  
int32 6 26085 日
int32 9 26412 本
int32 12 35486 語

ちなchrっぽいアレ
int32 65 A

こうなる。

stringへindex accessするとuint8型と扱われる。当然ascii以外の文字はぶっ壊れる

stringへrange accessすると、ascii文字を含めてint32として扱われる。ascii以外の文字を読み込んだ時はちゃんとindexも多めにずれる。ワザマエ

おまけとして、unicode/utf8にRuneStart(b byte) boolっていう与えられたbyteからunicode文字列が始まれるか教えてくれる関数があって、こいつとindex accessを組み合わせればrangeみたいなこともできるっぽい。