LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-04-19

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)
    }
}
5
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4