コンテンツにスキップ

Go/type literal

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

Goにおける型リテラル (type literal) とは、名前を持たない型を直接記述する方法のことです。既存の型名を参照するのではなく、型の構造そのものをコード中に記述します。

型リテラルは、主に以下の種類の型を記述する際に用いられます。

配列型
[n]T (nは配列の要素数、Tは要素の型)
var a [3]int  // 長さ3のint型配列
スライス型
[]T (Tは要素の型)
var s []string // string型のスライス
マップ型
map[K]V (Kはキーの型、Vは値の型)
var m map[string]int // キーがstring型、値がint型のマップ
構造体型
struct { フィールド名 型 ... }
var p struct {
    Name string
    Age  int
}
ポインタ型
T (Tは指し示す型)
var ptr *int // int型へのポインタ
関数型
func(引数型...) 戻り値型
var f func(int, int) int // int型を2つ受け取り、int型を返す関数
チャネル型
chan T, chan<- T, <-chan T (Tはチャネルで送受信する型)
var ch chan int    // int型の送受信が可能なチャネル
var sendCh chan<- string // string型の送信専用チャネル
var recvCh <-chan bool   // bool型の受信専用チャネル
インターフェース型
interface { メソッド名(引数型...) 戻り値型 ... }
var i interface {
    Read(p []byte) (n int, err error)
    Write(p []byte) (n int, err error)
}

型リテラルの利点:

[編集]
匿名性
一度しか使わないような型にわざわざ名前をつける必要がないため、コードを簡潔に保てます。
その場での定義
型の定義とその型の変数の宣言を同時に行うことができ、コードの局所性を高めます。

型リテラルの例:

[編集]
package main

import "fmt"

func main() {
	// 配列型リテラル
	var array [5]int
	array[0] = 1

	// スライス型リテラル
	slice := []string{"apple", "banana", "cherry"}

	// マップ型リテラル
	m := map[string]int{"Alice": 30, "Bob": 25}

	// 構造体型リテラル
	person := struct {
		Name string
		Age  int
	}{Name: "Charlie", Age: 35}

	// 関数型リテラル
	add := func(a, b int) int {
		return a + b
	}

	fmt.Println(array)
	fmt.Println(slice)
	fmt.Println(m)
	fmt.Println(person)
	fmt.Println(add(5, 3))
}

このように、型リテラルを使うことで、必要な型の構造をその場で直接記述し、コードをより柔軟かつ簡潔に記述することができます。名前付きの型定義 (type NewTypeName ExistingType) と合わせて、Goの型システムを理解する上で重要な概念です。