こんにちは。
今日は「変数とその定義方法」についてです。
変数とその定義方法についての確認と、変数定義に失敗しているソースコードを修正してもらいます。
変数の種類
Go言語は、静的型付け言語であるためコンパイル時に変数に紐付いた型の情報に整合性があるか検証されます。 この講義では深く触れませんが、下にGo言語における方の種類について簡単な説明を記載します。 興味のある方は公式ドキュメントを見てみてください。
- 組み込み型
- 整数
- int,int8,int16,int32,int64
- uint,uint8,uint16,uint32,uint64
- uintptr
- byte
- uint8 のエイリアス(別名)です
- rune
- int32 のエイリアス(別名)です
- 浮動小数点
- float32,float64
- 複素数
- complex64,complex128
- 文字列
- string
- stringを構成する文字はruneで構成されます
- string
- 真偽値
- bool
- エラー
- error
- 整数
- コンポジット型
0個以上の変数をひとまとまりの集合として表した型です- 構造体 (struct)
- 配列 (array)
- スライス (slice)
- マップ (map)
- チャンネル (channel)
- ユーザー定義型
組み込み型やコンポジット型を元にユーザーが定義した型です - Interface型
これまで説明した型はデータがメモリ上にどのように表現されているかという観点から区別されていました。 このinterface型は方がどう振る舞うか(型にどんなメソッドが実装されているか)という観点で区別され、0個以上のメソッドから構成されます。 また、Go1.18からGenericsが追加されました。これにより、interfaceに型の情報を組み込むことができるようになりました。
変数定義方法
Go言語では、変数の定義方法が3つあります。
- var <変数名> <型>
例: var Hensu string
型指定有り。変数初期値の指定無し(stringなので、""になります。) - <変数名> := <初期値>
例: Hensu := "myValue"
型指定無し。代入元の型を引き継ぐ - var <変数名> <型> = <初期値>
例: var Hensu string = "myValue"
型指定有り。変数初期値の指定有り
予期せぬ型が変数に定義されないよう、最初のうち(書いている型をイメージできるまで)は、1か3の書き方をお勧めします。
予期せぬ型が変数に定義されうる例として、interface型 があります。
本講義では、interface型 は扱わない為説明は割愛しますが、なんでも型(any) のような使い方ができます。
変数なんでも型が示しているのは、int型だと思っていたらstring型だった。というようなケースもおきえるので、注意が必要です。
Go言語の名前空間は、privateは先頭小文字。Publicが先頭大文字と決まっています。
packageに含める要素(変数や関数、構造体や構造体の要素など)をpackageの外部から参照させたい場合、先頭大文字の変数名とするようご注意ください。
不具合箇所は、最高の講師に教えてもらおう
Go言語では、書き方を間違えているととても丁寧に教えてくれる強い味方がいます。
それは、コンパイラ(go build)です。
「うーん、あ、この辺のソースみた?」とだけ返してくる先輩に比べ、「3行目、6文字目。変数定義されていないよ!?」と場所まで指定して教えてくれます。
変数定義方法で、1や3を勧めた理由の1つとして、型が異なる場合にコンパイラに教えてもらえる可能性が高まるためというのもあります。
ちょっと厳しい点があるとすれば、指摘が英語な点でしょうか。
中学生レベルの英語と、単語を調べる力があれば解決できる文章しか出てこないので、ぜひgo build大先生に弟子入りしてみてください。
エラーが多いと、数個のエラーの後にtoo many error....と続き、全てのエラーを教えてくれないことがあります。
しょうがないので、教えてもらっているエラーから対処していきましょう。
以下のコマンドを実行して、修正箇所を認識てみよう。
:# TERMINAL 0
$ cd /go/src/go_tutorial/3_var/plzfixme/
$ go run main.go
結果
:# TERMINAL 0
$ go run main.go
# command-line-arguments
./main.go:6:2: undefined: WatashiNoHensu
./main.go:7:14: undefined: WatashiNoHensu
不具合の修正
ソースコードを修正し、エラーを無くしてみよう。
:# TERMINAL 0
$ <お好きなエディタ> main.go
$ go run main.go
package main
import "fmt"
func main() {
Watashi_no_Hensu = "GYUDON" //./main.go:6:2: undefined: Watashi_no_Hensu
fmt.Println(Watashi_no_Hensu) //./main.go:7:14: undefined: Watashi_no_Hensu
}
結果
:# TERMINAL 0
$ <お好きなエディタ> main.go
$ go run main.go
GYUDON
今日は以上です。
ありがとうございました。
次のPart 4は「関数とその定義方法」です。
よろしくお願いいたします。