はじめに
タイトル通り、いまさらながらGo言語について学習し始めたので、記事として残します。
Go言語とは
GoはGoogleが開発した静的型付けのコンパイル言語で、シンプルさと効率性を重視して設計されています。Goは非常に高速で、並行プログラミングをサポートしています。これは、CPUコアを効果的に利用して、高性能なアプリケーションを作成するために重要な特性です。
プログラムの構造
Goのプログラムはパッケージとして組織されています。main
パッケージは特別で、Goプログラムの実行はmain
パッケージから始まり、main
関数から始まります。例えば:
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
このプログラムは"Hello, world!"と出力します。fmt
は標準ライブラリの一部で、フォーマットされたI/Oを提供します。
変数と定数
Goでは、var
キーワードを使って変数を宣言します。例えば:
var x int
x = 10
または、初期化と一緒に変数を宣言することもできます:
var x int = 10
また、:=
演算子を使用して、型宣言を省略することもできます。この場合、変数の型は右辺の式から推論されます。
x := 10 // x is an int
定数はconst
キーワードを使って宣言します。定数は、コンパイル時に値が決定され、その後は変更できません。
const Pi = 3.14
データ型
Goには、以下のような基本的なデータ型があります:
-
整数型(int、uint、int8、uint8、int16、uint16、int32、uint32、int64、uint64):
int
とuint
は、32ビットシステムでは32ビット、64ビットシステムでは64ビットです。int8
、int16
などの型は、数値の範囲を示しています。たとえば、int8
は-128から127までの値を持つことができます。 -
浮動小数点型(float32、float64): これらは小数点以下の数値を持つことができます。
-
複素数型(complex64、complex128): これらは複素数を表します。
-
ブール型(bool):
true
またはfalse
の値を持つことができます。 -
文字列型(string): テキストを表します。
制御フロー
Goには、他の多くのプログラミング言語と同様に、if
、for
、switch
といった制御フロー構造があります。
-
if
は条件分岐を行います:if x > 0 { fmt.Println("x is positive") }
-
for
はループを行います。Goにはfor
文しかループ構造がないため、他の言語のwhile
ループやdo-while
ループを模倣することもできます:for i := 0; i < 10; i++ { fmt.Println(i) }
-
switch
は多方向の分岐を行います:switch x { case 0: fmt.Println("x is zero") case 1: fmt.Println("x is one") default: fmt.Println("x is neither zero nor one") }
もちろんです。それでは、Goにおける関数とエラー処理について学んでいきましょう。
関数の定義と呼び出し
Go言語では、func
キーワードを使って関数を定義します。以下に関数の基本的な定義を示します。
func greet(name string) {
fmt.Println("Hello", name)
}
この例では、greet
という名前の関数を定義しています。この関数は一つのパラメータname
を受け取り、"Hello"とそのパラメータを出力します。
この関数を呼び出すには、以下のようにします。
greet("Alice")
このコードは"Hello Alice"と出力します。
複数の戻り値
Go言語では、一つの関数が複数の値を返すことができます。これは、エラーハンドリングや複数の結果を返す必要がある関数を書く際に非常に便利です。
func divmod(a, b int) (int, int) {
return a / b, a % b
}
この例では、divmod
関数は商と余りを返します。この関数を呼び出すには、以下のようにします。
quotient, remainder := divmod(7, 3)
fmt.Println("quotient:", quotient)
fmt.Println("remainder:", remainder)
このコードは以下のように出力します。
quotient: 2
remainder: 1
エラーハンドリング
Go言語では、エラーハンドリングはerror
型を用いて行います。エラーが発生する可能性がある関数は、通常、戻り値として最後にerror
型の値を返します。
以下に、エラーハンドリングの例を示します。
func sqrt(x float64) (float64, error) {
if x < 0 {
return 0, errors.New("undefined for negative numbers")
}
// Compute and return square root of x
}
この例では、sqrt
関数は負の数に対しては定義されていないため、x
が負の場合にはエラーを返します。この関数を呼び出す際には、エラーをチェックする必要があります。
result, err := sqrt(-1)
if err != nil {
fmt.Println("Error:", err)
} else {
fmt.Println("Result:", result)
}
このコードは"Error: undefined for negative numbers"と出力します。