Go 言語入門基礎学習ノートの Go 言語の基礎文法とデータ型
基礎文法#
Go マーク#
Go プログラムは複数のマークで構成され、キーワード、識別子、定数、文字列、記号であることができます。
行区切り#
Go プログラムでは、一行が一つの文の終了を表します。各文は C 系の他の言語のようにセミコロン ;
で終わる必要はなく、これらの作業は Go コンパイラによって自動的に行われます。
複数の文を同じ行に書く場合は、セミコロンで区切る必要がありますが、実際の開発ではこの方法は推奨されません。
コメント#
// 単一行コメント
/*
複数行コメント / ブロックコメント
*/
C 言語と一致しています。
識別子#
識別子は変数、型などのプログラムエンティティに名前を付けるために使用されます。識別子は実際には一つまたは複数の文字 (A~Z と a~z) 数字 (0~9)、アンダースコア_で構成されたシーケンスですが、最初の文字は文字またはアンダースコアでなければならず、数字ではいけません。
これはほとんどのプログラミング言語の規範と同じです。
例えば、mahesh
、kumar
、abc
、move_name
、a_123
、myname50
、_temp
、j
、a23b9
、retVal
はすべて有効な識別子です。1ab
は数字で始まり、case
はキーワード、a+b
は他の文字などは無効な文字です。
文字列結合#
Go 言語の文字列結合は +
を使用して実現できます。
fmt.Println("Google" + "Runoob")
キーワード#
Go 言語には合計 25 のキーワードがあります。
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
そのほかに、Go 言語には 36 の定義済み識別子があります。
append | bool | byte | cap | close | complex |
copy | false | float 32 | float 64 | imag | int |
int 32 | int 64 | iota | len | make | new |
println | real | recover | string | true | |
complex 64 | complex 128 | uint 16 | int 16 | uint 32 | uintptr |
panic | uint 8 | uint 64 | int 8 | uint | nil |
Go 言語における空白#
Go 言語では、空白は通常、識別子、キーワード、演算子、式を区切るために使用され、コードの可読性を向上させます。
変数の宣言は空白で区切る必要があります。
var x int
const Pi float64 = 3.14159265358979323846
変数と演算子の間には空白を入れることが推奨され、プログラムがより美しく見えます。
var z int = x + y
キーワードと式の間には必ず空白を入れる必要があります。
if x > 0 {
// 何かをする
}
関数呼び出し時には、関数名と左側の等号の間に空白を入れ、引数の間にも空白を入れる必要があります。
result := add(2, 3)
フォーマットされた文字列#
Go 言語では fmt.Sprintf
または fmt.Printf
を使用して文字列をフォーマットし、新しい文字列に代入します:
Sprintf
はフォーマットパラメータに基づいてフォーマットされた文字列を生成し、その文字列を返します。Printf
はフォーマットパラメータに基づいてフォーマットされた文字列を生成し、標準出力に書き込みます。
package main
import (
"fmt"
)
func main() {
// %d は整数、%s は文字列を表します
var stockcode=123
var enddate="2024-10-25"
var url="Code=%d&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)
fmt.Printf(url,stockcode,enddate)
}
// 出力結果
Code=123&endDate=2024-10-25
Code=123&endDate=2024-10-25
補足:fmt パッケージのさまざまな出力方法の違い
fmt.Print
はそのまま出力しますfmt.Printf
はフォーマットされた出力をしますfmt.Println
は各値の間に空白を加え、末尾に改行を加えます
Go 言語には
println()
とprint()
といういくつかの組み込み関数があり、どちらもパッケージに属さず、直接使用できます。単純に引数を出力するだけで、フォーマットはサポートされておらず、通常は簡単なデバッグ目的で使用されます。
println()
とprint()
は fmt のfmt.Println
とfmt.Print
の違いと同じです。
fmt.Print("go","python","php","javascript") // gopythonphpjavascript
fmt.Println("go","python","php","javascript") // go python php javascript
fmt.Printf("go %d", 1) // go 1
println("Hello Go!") // Hello Go!
データ型#
データ型の出現は、データを必要なメモリサイズの異なるデータに分けるためであり、プログラミングの際には大きなデータを使用する場合に大きなメモリを要求する必要がありますので、メモリを十分に活用できます。
Go 言語はカテゴリに応じて以下のようなデータ型に分けられます:
- ブール型:値は定数 true または false のみです
- 数値型:Go 言語は整数型と浮動小数点型の数値をサポートし、複素数もサポートしています。その際、ビット演算は補数を使用します
- 文字列型:Go 言語の文字列は単一のバイトで結合されており、文字列のバイトは UTF-8 または Unicode エンコーディングを使用します
- 派生型:
- ポインタ Pointer
- 配列
- 構造体
- チャネル Channel
- 関数 Function
- スライス Slice
- インターフェース
- マップ Map
参照型: スライス Slice、ポインタ、マップ Map、チャネル Channel、関数
数値型:
整数型:Go にはアーキテクチャに基づく型もあり、例えば:int、uint および uintptr があります。
型 | 説明 |
---|---|
uint 8 | 無符号 8 ビット整数 (0 から 255) |
uint 16 | 無符号 16 ビット整数 (0 から $2^{16}-1$) |
uint 32 | 無符号 32 ビット整数 (0 から $2^{32}-1$) |
uint 64 | 無符号 64 ビット整数 (0 から $2^{64}-1$) |
int 8 | 有符号 8 ビット整数 (-128 から 127) |
int 16 | 有符号 16 ビット整数 ($-2^{15}$ から $-2^{15}-1$) |
int 32 | 有符号 32 ビット整数 ($-2^{31}$ から $2^{31}-1$) |
int 64 | 有符号 64 ビット整数 ($-2^{63}$ から $2^{63}-1$) |
Go において
int
は不定長の型であり、現在のコンピュータのワード長に依存します。現在のコンピュータが 64 ビットの場合、int
型も 64 ビットになりますが、これはint64
の長さと同じですが、依然として異なる二つのデータ型です。
浮動小数点型:
型 | 説明 |
---|---|
float 32 | IEEE-754 32 ビット浮動小数点数 |
float 64 | IEEE-754 64 ビット浮動小数点数 |
complex 64 | 32 ビット実数と虚数 |
complex 128 | 64 ビット実数と虚数 |
その他の数値型:
型 | 説明 |
---|---|
byte | uint 8 に似ています |
rune | int 32 に似ています |
uint | 32 または 64 ビット |
int | uint と同じサイズ |
uintptr | 無符号整数、ポインタを格納するために使用されます |
Go 言語はフォーマットされた文字列
%T
を使用してデータ型を印刷できます。
fmt.Printf("type: %T\n", a)
浮動小数点精度の問題
浮動小数点数の計算出力には一定の偏差がありますが、整数に変換して精度を設定することもできます。
package main
import (
"fmt"
)
func main() {
a := 1.69
b := 1.7
c := a * b // 結果は 2.873 であるべきです
fmt.Println(c) // 出力は 2.8729999999999998 です
}
精度を設定する
package main
import (
"fmt"
)
func main() {
a := 1690 // 1.69 を表します
b := 1700 // 1.70 を表します
c := a * b // 結果は 2873000 で 2.873 を表します
fmt.Println(c) // 内部エンコーディング
fmt.Println(float64(c) / 1000000) // 表示
}