Help us understand the problem. What is going on with this article?

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

More than 5 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)
    }
}
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした