Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
18
Help us understand the problem. What is going on with this article?
@Hiraku

Goの定数の型宣言

More than 1 year has passed since last update.

Goの定数は型のない状態で宣言できる。

const a = 1

こうしておくと、intにもint64にも代入できる、不思議な状態を作ることができ、便利である。

var i1 int = a
var i2 int64 = a
// コンパイルできる

一方で、型つきで定数を作ることもできる。

const b int = 1

この場合は型が固定されるので、int64には代入ができない。

var i3 int = b
var i4 int64 = b // コンパイルエラー

iotaを使った連続宣言

iotaという定数のための記法がある。constでまとめて宣言する際に、自動でインクリメントした値を作ってくれて便利。

package main

import "fmt"

const (
    aa int = iota
    bb
    cc
)

func main() {
    fmt.Println(aa, bb, cc) // 0, 1, 2
}

このように型と値を省略する記法は特殊で、型の値と宣言を引き継ぐ。この場合aa, bb, ccはすべてint型で宣言されている。

var i5 int64 = cc // コンパイルエラーになる

iotaでなくても、こうすることができて、

const (
    aa int = 1
    bb
    cc
)

この場合、aa,bb,cc全部がint型の1として宣言される。 (あまり意味がないのでiota以外ではこんな書き方はめったにしないが。)

iotaを使わずにまとめて定数宣言

iota記法を先に読んで、「あーなるほどそういうことね」と思ってはいけない。以下は間違いである。

package main

import "fmt"

const (
    aa int = 0
    bb     = 1
    cc     = 2
)

func main() {
    fmt.Println(aa, bb, cc) // 0, 1, 2
}

この場合、aaだけがint型として宣言されており、bbとccは型なしで宣言されていることになる。
aa~ccを全部int型で宣言するならば、こう書かないと駄目。

const (
    aa int = 0
    bb int = 1
    cc int = 2
)

もしくは、これでもよい。

const aa, bb, cc int = 0, 1, 2

enumのようなものを作るときによく混乱するのでまとめた。

18
Help us understand the problem. What is going on with this article?
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
Hiraku
PHP, Go界隈をうろうろしています。最近はgRPCと戦ってる。 特に明示していなければ、記事中のソースコード片は `CC-0 1.0` とします。出典表示無しで自由にコピペして頂いて構いません。 ただ、記事自体をコピペされるのは嫌なので、ソースコード部分以外の文章は通常通り全ての著作権を私が保持するものとします。 引用を超える範囲のコピペは止めて下さい。
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
18
Help us understand the problem. What is going on with this article?