Qiitaで「自分用メモ」って検索したらまぁまぁあったから僕も自分用メモをメモ帳からQiitaに移行しようと思います。
独立した記事にするまでもない事を書こうと思ってます。
// 読んでくれてありがとうございます。基本チラ裏です。あなたに有用な事は何一つ無いかもしれません。
配列の添字でインクリメントできない
a[i++]
↑できない
というか、フォーマットの時点でエラーが出る。
フォーマット時エラー:
expected ']', found '++'
実行時エラー:
syntax error: unexpected ++, expecting :
結果
a[i]
i++
こうするしかない。
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だと-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)
}
これだと下記みたいなエラー出ちゃうんですよね〜
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)
}
エラー出ます。
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)
}
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)
}
}