4
1

More than 1 year has passed since last update.

Go言語入門 学習メモ 5 type、for..range

Posted at

はじめに

船井総研デジタルのoswです。業務でGo言語を使うことになったのでこれから学習していきます。その備忘録です。参考になる方がいらっしゃれば幸いです。

対象読者

  • これからGo言語を学習する方
  • 既に他の言語で基本構文を学習されている方

学習環境

学習環境は次のようになっています。この環境の構築メモは下記記事にまとめてあります。ご興味がある方はご参照ください。

  • Windows 11 Home / 22H2
  • VSCode / 1.72.2
  • go version go1.19.2 windows/amd64
  • git version 2.38.0.windows.1

前回までの学習

前回は ポインタ、コンポジット型(配列、構造体、スライス、マップ)を学習しました。

ユーザ定義型

typeは新規の型を作るためのキーワードで、Cでいうところのtypedefのようです。typeは構造体の学習でも出てきました。構造体自体はstructで宣言するでしょうし、typeは何者?と思っていましたが、新規で型を作成するキーワードということで謎が解決しました。

構文
// 標準で既に定義されている型(基底型)に別名を付ける、構造体に型名を付与する
type ユーザ型名 
サンプルコード
package main

import "fmt"

func main() {
    // 型を新しく定義
	type SampleInt   int
	type SampleFloat float64

	var i SampleInt   = 100
	var f SampleFloat = 3.14

    // 書式指定に%Tを指定すると型を取得できる
	fmt.Printf("i: %4d %T \n", i, i)
	fmt.Printf("f: %.2f %T \n", f, f)
}
実行結果
i:  100 main.SampleInt 
f: 3.14 main.SampleFloat 

書式は下記記事で解説してくださっています。

for range

Goには繰り返し構文がforしかないようですが、rangeを使うと拡張for文のような書き方ができるようで便利です。データ取得の対象はコンポジット型ならとりあえず適用できるようです。サンプルコードでは配列、スライス、マップで試しています。

また、C++ / Javaなどと違い、要素を取り出してくるだけでなくインデックスも取得できるようです。インデックスが不要な場合は"_"で破棄します。

構文
for インデックス格納用変数, 値用変数 := range データの取得元 {
    // 処理
}

// 変数を1つだけ用意するとインデックスのみ取得する
for インデックス格納用変数 := range データの取得元 {
    // 処理
}

// 不要な値は"_"で捨てることができる。"_"はPrint()などで中を出力できない
for _, 値用変数 := range データの取得元 {
    // 処理
}
サンプルコード
package main

import "fmt"

func main() {

	array := [...]int{0, 1, 2, 3, 4}
	slice := array[:]
	mp    := map[int]string{
		0: "ichiro",
		1: "jiro",
		2: "saburo",
		3: "goro",
		4: "rokuro",
	}

	// 配列、スライス、マップに対しfor..rangeが適用できるか動作確認
	fmt.Println("配列の動作確認")
	for i, v := range array {
		fmt.Println("i:", i, ", v:", v)
	}

	fmt.Println("\nスライスの動作確認")
	for i, v := range slice {
		fmt.Println("i:", i, ", v:", v)
	}

	fmt.Println("\nマップの動作確認")
	for i, v := range mp {
		fmt.Println("i:", i, ", v:", v)
	}

	tmpArray := [...]int {10, 11, 12, 13, 14}

	// 変数を1つだけ用意するとインデックスのみ取得する
	fmt.Println("\nインデックスのみ取得")
	for i := range tmpArray {
		fmt.Println("i:", i)
	}

	// 不要な値は"_"で捨てることができる。"_"はPrint()などで中身を出力できない
	fmt.Println("\n値のみ取得")
	for _, v := range tmpArray {
		// fmt.Println("_:", _) "_"は出力できない
		fmt.Println("v:", v)
	}
}
実行結果
配列の動作確認
i: 0 , v: 0
i: 1 , v: 1
i: 2 , v: 2
i: 3 , v: 3
i: 4 , v: 4

スライスの動作確認
i: 0 , v: 0
i: 1 , v: 1
i: 2 , v: 2
i: 3 , v: 3
i: 4 , v: 4

マップの動作確認
i: 4 , v: rokuro
i: 0 , v: ichiro
i: 1 , v: jiro
i: 2 , v: saburo
i: 3 , v: goro

インデックスのみ取得
i: 0
i: 1
i: 2
i: 3
i: 4

値のみ取得
v: 10
v: 11
v: 12
v: 13
v: 14

おわりに

今回はここまでです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1