目次
Goの特徴
特徴
- 文末のセミコロンを付ける必要はない(付けてもOK)。
- セミコロンで文を区切れば1行に複数の処理を記載できる。
- 値の代入はイコール(
=
)。 - ダブルクォートで括ると通常の文字列、バッククォートで括ると
raw文字列
。 - 処理のブロックは波括弧で括る。
- クラスのメンバアクセスはドットで行う。
- 大文字と小文字は区別される。
- 識別子に使えるのは文字、数値、アンダースコアで数値以外から始める(2バイト文字も使用可)。
- 単行コメントは「
// ~~
」、複数行コメントは「/* ~~ */
」。 - 変数宣言は「
var
」。 - 関数定義は「
func
関数名(引数...)」、戻り値の指定は「return
式」。
類似の言語
- CやJavaの文法に近い。
HelloWorld
package main import "fmt" func main() { fmt.Println("Hello, World.") }
パッケージ
パッケージとは
- Go言語のプログラムは一つ以上のパッケージで構成されます。
- パッケージは一つ以上のソースファイルで構成されます。
- パッケージの宣言には
package文
を使用します。 - 同じパッケージに属するソースファイルは全て同一のディレクトリに格納します。
- 一つのディレクトリに複数のパッケージをまとめることはできません。
- プログラムはmainパッケージのmain関数から開始されます(エントリポイント)。
- mainパッケージを除き、パッケージ名と格納ディレクトリは同じにする慣例(必須ではない)。
例:同一パッケージのソースファイル
s1.go
// p1パッケージ package p1 func fnc1() { // 略 }
s2.go
// p1パッケージ package p1 func fnc2() { fnc1() // 同一パッケージ内の関数を呼び出す }
インポート
- 他のパッケージをインポートするには
import文
を使用します。 - 複数のパッケージをインポートする場合は、括弧を使ってまとめることもできます。
例:インポート
// 単一のインポート import "p1"
// 複数のインポート import ( "p2" "p3" "p4" )
エクスポート
- 名前の先頭を小文字にするか大文字にするかでメンバーの公開範囲(エクスポート)を決めることができます。
- 小文字から始まるメンバーは異なるパッケージに属するソースからは参照できなくなります。
- 大文字から始まるメンバーは異なるパッケージに属するソースからも参照できます。
例:エクスポート
package p1 // この関数はp1パッケージ以外からは使用できない func fnc1() { // 略 } // この関数はp1パッケージ以外から使用可能 func Fnc2() { // 略 }
変数
変数宣言
- 変数宣言は
var
キーワードにて行います。 - 基本的には
var <変数名> <型名>
の形式で宣言します。 - 「初期値の指定」や「型の省略」も可能です。
- 「型を省略」した場合は、初期値に応じて自動的に型が決まります。
- 「初期値を省略」した場合は、型ごとに決まっている
ゼロ値
で初期化されます。
- 複数の変数を宣言する場合は、括弧を使ってまとめることもできます。
- 変数に値を設定するとき、カンマで区切って複数同時に設定可能です。
初期値指定なし
var <変数名> <型名>
初期値指定あり
var <変数名> <型名> = <初期値>
型を省略
var <変数名> = <初期値>
複数の変数宣言
var ( <変数名> <型名> <変数名> <型名> = <初期値> <変数名> = <初期値> )
例:変数宣言
// 単一の変数宣言 var a int var b int = 1 var c = 0 // 複数の変数宣言 var ( d int e int = 1 f = 0 ) // 複数代入 var a1, a2 int var b1, b2 int = 0, 1 var c1, c2 = 0, 1
ローカル変数
- Goの変数スコープは
グローバルスコープ
とローカルスコープ
の2種類があります。 - ソースのトップレベルで宣言すれば
グローバルスコープ
になります。 - 関数内で宣言すれば
ローカルスコープ
になります。- ローカルスコープの変数に限り、
<変数名> := <式>
の形式で宣言できます。 - この形式の時は変数の型は指定できません。
- ローカルスコープの変数に限り、
ローカル変数宣言
func xxx() { <変数名> := <式> }
例:ローカル変数
func main() { a := 1 b, c := 2, 3 var d int = 4 // varも使用可能 }
定数
定数
は値を変更できない変数
です。- 定数宣言は
const
キーワードにて行います。 - 型を持つ定数と、型を持たない定数の両方が定義できます。
型指定を省略
const <変数名> = <初期値>
値指定あり
const <変数名> <型名> = <初期値>
型指定の無い定数
- 型を指定しない形式で宣言しておくと、型の範囲に入る変数に代入できるの便利です。
aはintにもint64にも代入できる
const a = 1 var i1 int = a var i2 int64 = a
bはint64に代入できない
const b int = 1 var i1 int = b var i2 int64 = b // コンパイルエラー!
演算子
算術演算子
演算子 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 剰余(あまり) |
& | ビットAND |
| | ビットOR |
^ | ビットXOR |
&^ | ビットAND NOT |
<< | 左シフト |
>> | 右シフト |
+=
や&=
のように代入を伴う表記も可能です。
比較演算子
演算子 | 説明 |
---|---|
== | 等しい |
!= | 等しくない |
< | 未満 |
<= | 以下 |
> | より大きい |
>= | 以上 |
論理演算子
2023-05-12 更新演算子 | 説明 |
---|---|
&& | AND |
|| | OR |
! | NOT |
単項演算子
演算子 | 説明 |
---|---|
++ | インクリメント |
-- | デクリメント |
- | マイナス |
^ | ビットNOT |
| | 論理NOT |
演算子の優先順位
優先度 | 演算子 |
---|---|
高 | * / % << >> & &^ |
↑ | + - | ^ |
== != < <= > >= | |
↓ | && |
低 | || |
基本型と複合型
- データ型は
基本型
と複合型
の2つに分かれます。 基本型
は単体で意味を成すデータを扱います。基本型
には数値型
と文字列型
と真偽値型
があります。
複合型
は他の型と組み合わせて使用するようなデータを扱います。基本型
以外が``複合型`です。
参考
サンプルソース
- (language-examples) 0001_hello-world
- (language-examples) 0002_package
- (language-examples) 0003_variable
- (language-examples) 0004_const
参考サイト
- (Qiita) GOMODULE--Goのパッケージ管理
- (Qiita) Goの定数の型宣言
- (Qiita) golang パッケージについてざっくり理解する。
- (Qiita) ひさしぶりのHello world ~ Go編 ~
- (Qiita) 他言語から来た人がGoを使い始めてすぐハマったこととその答え
- (Zenn) Go のモジュール管理【バージョン 1.17 改訂版】
- (teratail) Go言語のcannot find module for pathの解消法
- (エンジニアへの道) Goの算術演算子、比較演算子、論理演算子の使い方
- (天才まくまくノート) Go のワークスペースの考え方 (GOPATH)
- (天才まくまくノート) 定数を定義する (const)
- Go言語 演算子