Go言語の型一覧について解説
この記事では、Go言語の型一覧をシンプルにまとめています。
基本型から複合型、関数やインターフェースなど、主要な型の特徴を分かりやすく紹介します。
すでに開発環境が整っている方は、記事を読みながらすぐに実践できる内容となっていますので、ぜひご参考ください。
基本型
数値型
整数型
整数型は符号あり・符号なしの整数を扱います。
整数型の変数宣言や計算のサンプルを以下に示します。
package main
import "fmt"
func main() {
// int型変数の宣言と初期化
var a int = 10
// uint型変数の宣言と初期化(符号なし)
var b uint = 20
// 足し算の結果を表示
fmt.Println("整数の和:", a+int(b))
}
整数の和: 30
浮動小数点数型と複素数型
浮動小数点数型は実数、複素数型は複素数を表現するのに使います。
複素数は
package main
import "fmt"
func main() {
// float型変数の宣言と初期化
var x float64 = 3.1415
// 複素数型変数の宣言と初期化
var c complex128 = 2 + 3i
// 値を表示
fmt.Println("浮動小数点数:", x)
fmt.Println("複素数:", c)
}
浮動小数点数: 3.1415
複素数: (2+3i)
文字列型
文字列型はテキストデータを扱います。
文字列の結合や長さの取得などが可能です。
package main
import (
"fmt"
"strings"
)
func main() {
// 文字列型変数の宣言と初期化
var greeting string = "Hello"
var target string = "Go"
// 文字列の結合
combined := greeting + ", " + target + "!"
// 大文字化して表示
fmt.Println("結合後の文字列:", strings.ToUpper(combined))
}
結合後の文字列: HELLO, GO!
ブール型
ブール型は論理値(true/false)を扱います。
条件分岐や論理演算に用います。
package main
import "fmt"
func main() {
// ブール型変数の宣言と初期化
var isAvailable bool = true
var isComplete bool = false
// 論理演算
result := isAvailable && !isComplete
// 結果の表示
fmt.Println("条件の結果:", result)
}
条件の結果: true
複合型
配列
配列は固定長で同じ型の複数の要素を持つコレクションです。
package main
import "fmt"
func main() {
// 配列の宣言と初期化
var numbers [3]int = [3]int{1, 2, 3}
// 配列の中身を表示
fmt.Println("配列の要素:", numbers)
}
配列の要素: [1 2 3]
スライス
スライスは可変長で柔軟な操作が可能な配列のようなものです。
package main
import "fmt"
func main() {
// スライスの作成と初期化
numbers := []int{10, 20, 30, 40}
// 要素の追加
numbers = append(numbers, 50)
// スライスの中身を表示
fmt.Println("スライスの要素:", numbers)
}
スライスの要素: [10 20 30 40 50]
マップ
マップはキーと値のペアを格納する連想配列です。
package main
import "fmt"
func main() {
// マップの宣言と初期化
colors := map[string]string{
"red": "#ff0000",
"green": "#00ff00",
"blue": "#0000ff",
}
// マップの内容を表示
for key, value := range colors {
fmt.Println(key, "=>", value)
}
}
red => #ff0000
green => #00ff00
blue => #0000ff
構造体
構造体は複数のフィールドを持つデータ型です。
関連する情報をまとめて扱うことができます。
package main
import "fmt"
// Personという名前の構造体を定義
type Person struct {
Name string
Age int
}
func main() {
// 構造体のインスタンス作成
person := Person{
Name: "Alice",
Age: 30,
}
// フィールドの値を表示
fmt.Printf("名前: %s, 年齢: %d\n", person.Name, person.Age)
}
名前: Alice, 年齢: 30
ポインタ型
ポインタは変数のメモリアドレスを保持します。
変数の値を直接操作するのに便利です。
package main
import "fmt"
func main() {
// int型変数の宣言と初期化
var num int = 100
// numのアドレスをポインタ変数ptrに代入
ptr := &num
// ポインタを使って変数の値を変更
*ptr = 200
// 値とアドレスを表示
fmt.Println("numの値:", num)
fmt.Println("ptrの指す値:", *ptr)
}
numの値: 200
ptrの指す値: 200
関数とインターフェース
関数型
関数も第一級オブジェクトとして扱えるため、変数への代入や引数で渡すことができます。
関数リテラル
関数リテラルは名前のない匿名関数を定義する方法です。
package main
import "fmt"
func main() {
// 匿名関数を定義して変数addに代入
add := func(a int, b int) int {
// 2つの整数の和を返す
return a + b
}
// 関数リテラルを呼び出し
result := add(5, 7)
fmt.Println("和:", result)
}
和: 12
クロージャ
クロージャは、外側の関数の変数を捕捉する関数リテラルです。
状態を持たせることが可能です。
package main
import "fmt"
func main() {
// counterはクロージャによって状態を保持する変数
counter := func() func() int {
count := 0
// 無名関数がcountを捕捉して返す
return func() int {
count++ // countをインクリメント
return count
}
}()
// クロージャを複数回呼び出して状態を確認
fmt.Println("カウンター:", counter())
fmt.Println("カウンター:", counter())
fmt.Println("カウンター:", counter())
}
カウンター: 1
カウンター: 2
カウンター: 3
インターフェース型
インターフェース型は、メソッドのシグニチャ(型)を定義し、異なる型に共通の振る舞いを持たせるために用いられます。
package main
import "fmt"
// Speakerインターフェースを定義
type Speaker interface {
Speak() string
}
// Dog型を定義し、Speakerインターフェースを実装する
type Dog struct{}
func (d Dog) Speak() string {
return "Bow-wow" // 犬の鳴き声
}
// Cat型を定義し、Speakerインターフェースを実装する
type Cat struct{}
func (c Cat) Speak() string {
return "Meow" // 猫の鳴き声
}
func main() {
// Speaker型のスライスにDogとCatを格納
animals := []Speaker{Dog{}, Cat{}}
// 各要素のSpeakメソッドを呼び出して表示
for _, animal := range animals {
fmt.Println(animal.Speak())
}
}
Bow-wow
Meow
並行処理とカスタム型
チャネル型
チャネル型はゴルーチン間での情報のやりとりに使います。
これにより並行処理が容易になります。
package main
import (
"fmt"
"time"
)
func main() {
// int型のチャネルを作成
ch := make(chan int)
// ゴルーチンで1秒後に値を送信
go func() {
time.Sleep(1000 * time.Millisecond)
ch <- 42 // チャネルに値を送信
}()
// チャネルから値を受信して表示
value := <-ch
fmt.Println("受信した値:", value)
}
受信した値: 42
カスタム型
Goでは既存の型から新たなカスタム型を定義できます。
ここでは型定義と型エイリアスの例を示します。
型定義
型定義を使うと、新しい型として振る舞うため、元の型と区別されます。
package main
import "fmt"
// Celsiusはfloat64を基にした新しい型
type Celsius float64
func main() {
var temperature Celsius = 36.5
fmt.Printf("体温: %.1f°C\n", temperature)
}
体温: 36.5°C
型エイリアス
型エイリアスは既存の型に別名を設定しただけで、同一の型として扱われます。
package main
import "fmt"
// CelsiusAliasはfloat64の型エイリアス
type CelsiusAlias = float64
func main() {
var temp CelsiusAlias = 36.5
fmt.Printf("体温(エイリアス): %.1f°C\n", temp)
}
体温(エイリアス): 36.5°C
まとめ
この記事では、Go言語の基本型、複合型、関数とインターフェース、並行処理とカスタム型についてサンプルコードを用いながら丁寧に解説しました。
全体を通して各型の特徴や実装方法が具体例とともに整理され、理解しやすい内容となっています。
ぜひ実際にコードを書いて試し、新たな技術習得に挑戦してみてください。