JSゆるふわめも

がっこうでべんきょうしたことをめもがきしてます

Go言語学習メモ

bit演算

y 0001

^単項で使用するとビット反転 ^y 1110

x 1011

符号ありの型をビット反転させると符号も反転する

 var ux uint = 0xff
    var uy uint = 0x1
    x := 0xff
    y := 0x1
    fmt.Printf("int x=%b int y=%b\n", x, y)
    fmt.Printf("^x=%b ^y=%b\n", ^x, ^y)
    fmt.Printf("uint x=%b uint y=%b\n", ux, uy)
    fmt.Printf("^ux=%b ^uy=%b\n", ux, uy)
    fmt.Printf("x&^y=%b \n", x&^y)
    fmt.Printf("y&^x=%b \n", y&^x)

&^二項演算子で使用するとビット差 x&^y 1010

bigの計算

var x,y big.Rat x.Add(&x,&y) //xを書き換える。

javaの場合bigIntergerに対するaddはGoで言うと下記のようになっている レシーバー(z)と第一引数(x)が異なるため、加算されるごとにメモリ消費量が増える したがって、Goはレシーバーと第一引数が一致している場合メモリ効率が良い x,y,z big.Rat z.Add(&x,&y)

UTF-8の自己同期化とは

そもそも同期とは? 例えばCPUアーキテクチャデータバスはバイト列の区切りをどのように判断しているのか CPUクロックを見てデータの区切りを判断している。つまり、データバスは自己では同期できていない

       0|0|1|0|0|
CPUクロック  ^ ^ ^ ^ ^

この意味で、UTF-8はそれ自身でデータの区切りがわかるフォーマットのため自己同期化されていると言える

Goのコンパイル環境

go env goに関する環境変数の表示

[GO_ROOT_BOOTSTRAP Go 1.7.1]を利用して、[~/tools/go/src]にある最新のコンパイラ[仮にNCompとする]が作成される。このNCompを利用して、残りの[~/tools/go/src]ソースコードコンパイルする。

初期の頃はこのBootStarpコンパイラC言語で書かれていた。

[~/tools/go/src]内のinternalは外からさわれないパッケージ vendarパッケージは3rdベンダーのソースコードを丸々取り込んでいるもの 丸々自分たちの領域に取り込むことで、goだけあれば動作することを保証している

Rune int32

Runeとint32は全く一緒の型

配列もしくはArrayへの配列言語仕様書に記載

func zero_array(ptr *[32]byte){
    for i := range ptr {
        ptr[i]=0
    }
}

//コンパイルエラー
func zero_array(ptr []byte) {
    for i := range ptr {
        ptr[i]=0
    }
}

func zero_array(ptr *[]byte) {
    for i := range ptr {
        (*ptr[i])=0
    }
}