Go自分用メモ(随時更新)

More than 3 years have passed since last update.

Qiitaで「自分用メモ」って検索したらまぁまぁあったから僕も自分用メモをメモ帳からQiitaに移行しようと思います。

独立した記事にするまでもない事を書こうと思ってます。

// 読んでくれてありがとうございます。基本チラ裏です。あなたに有用な事は何一つ無いかもしれません。


配列の添字でインクリメントできない

a[i++]

Go Playground

↑できない

というか、フォーマットの時点でエラーが出る。

フォーマット時エラー:

expected ']', found '++'

実行時エラー:

syntax error: unexpected ++, expecting :

結果

a[i]

i++

Go Playground

こうするしかない。


intは32bit環境と64bit環境でサイズが異なる

intは32bit環境だとint32のエイリアス(別名みたいなもの)、64bit環境だとint64のエイリアスとなる。

package main

import "fmt"

func main() {
var a byte = 0xFF
fmt.Println((int(a) << 24))
}

Go Playground

Go Playgroundだと-16777216

ローカル環境(mac)だと4278190080

どちらも16進数だとFF000000だけど、32bitと64bitで全然結果が違う。

調べると32bitと64bitでintのサイズが違った。

http://golang.org/doc/go1.1#int

(1.1からだそうです。)

簡単なプログラムならintでもいいですが、大きい値が入る可能性がある箇所は明示的にint32やint64と指定したほうがいいかもしれませんね。


余談

package main

import "fmt"

func main() {
fmt.Println(int(byte(0xFF)) << 24)
}

Go Playground

これだと下記みたいなエラー出ちゃうんですよね〜

6: constant 4278190080 overflows int

なんででしょうか?


同名関数が使用できない

Javaとかだと同じ名前で引数が違う関数が使えますが、Goは使えないようです。

package main

import "fmt"

func main() {
f(1, 2)
f("hello!")
}

func f(a int, b int) {
fmt.Println(a, b)
}

func f(c string) {
fmt.Println(c)
}

Go Playground

エラー出ます。

6: too many arguments in call to f

14: f redeclared in this block
previous declaration at /tmp/sandbox953653986/main.go:10

大文字小文字が違う関数はOKみたいですよ。

package main

import "fmt"

func main() {
f(1, 2)
F("hello!")
}

func f(a int, b int) {
fmt.Println(a, b)
}

func F(c string) {
fmt.Println(c)
}

Go Playground

1 2

hello!


forで2つの変数を操作

package main

import "fmt"

func main() {
for i, j := 0, 1; i < 10 || j < 20; i, j = i+1, j+1 {
fmt.Println("i:", i, "j:", j)
}
}


copyでslice→arrayはコピーできるけどarray→sliceはコピー出来ない

package main

import "fmt"

const (
size = 10
)

func main() {
// slice -> array できる
s := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
var a [size]int
copy(a[:], s)
arr(a)

// array -> slice できない
aa := [size]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
var ss []int
copy(ss, aa[:])
sli(ss)
}

func sli(s []int) {
fmt.Println(s)
for k, v := range s {
fmt.Println(k, v)
}
}

func arr(a [size]int) {
fmt.Println(a)
for k, v := range a {
fmt.Println(k, v)
}
}