Go言語のスライスのappend関数の使い方と応用例
生徒
「先生、Go言語のスライスって配列みたいだけど、append関数って何に使うんですか?」
先生
「append関数は、スライスに新しい要素を追加するときに使います。配列はサイズが決まっているけど、スライスは動的にサイズを変えられるんですよ。」
生徒
「なるほど。具体的にどうやって使うんですか?初心者でもわかるように教えてください!」
先生
「では、append関数の基本から応用まで、わかりやすく説明しますね!」
1. append関数とは?
Go言語のappend関数は、スライス(可変長の配列のような入れ物)に要素を足すための標準関数です。スライスには「いま入っている数」を表す長さ(length)と、「どこまで入れられるか」の容量(capacity)があり、appendは必要に応じて入れ物を広げながら新しい要素を受け止めます。
イメージは買い物カゴです。最初は小さなカゴでも、商品が増えたら店員さんが少し大きいカゴに中身ごと移してくれる感じ――あなたはただ「追加する」だけでOKです。ここで大切なのは、appendは新しいスライスを返すので、戻り値を受け取って使うのが基本だということです。
たとえば、空のリストに名前を1つ足すだけなら次のようになります(まずは雰囲気をつかみましょう)。
package main
import "fmt"
func main() {
var names []string // 空のスライスを用意
names = append(names, "太郎") // "太郎"を追加(戻り値を代入)
fmt.Println(names) // ["太郎"]
}
この段階では「スライス=増やせる入れ物」「append=足して返す」というイメージが持てれば十分です。細かな使い方や複数追加の書き方は、次のセクションで丁寧に見ていきます。
2. append関数の基本的な使い方
appendは、スライスに要素を1つ足して新しいスライスを返す関数です。ポイントは「返ってきたスライスを=で受け取る」こと。受け取らないと、見た目は追加しているのに実際の変数には反映されません。
numbers := []int{1, 2, 3}
numbers = append(numbers, 4) // 4を追加(返り値で上書きする)
fmt.Println(numbers) // [1 2 3 4]
「再代入が必要」という感覚をつかむために、実行可能な最小例も載せます。最初はこの形をそのまま写経すると覚えやすいです。
package main
import "fmt"
func main() {
nums := []int{1, 2, 3}
fmt.Println("追加前:", nums) // [1 2 3]
// 返ってきたスライスを受け取る(基本形)
nums = append(nums, 4)
fmt.Println("追加後:", nums) // [1 2 3 4]
// 受け取らないと変数は変わらない(よくあるつまずき)
tmp := []int{1, 2, 3}
append(tmp, 4) // 返り値を捨ててしまっている
fmt.Println("再代入なし:", tmp) // [1 2 3]
}
まとめると、append(元のスライス, 追加する要素)で追加し、変数 = append(...)と書くのが基本ルールです。これさえ押さえれば、スライスに値を足す操作は安心して書けます。
3. 複数の要素を一度に追加する方法
appendは要素をカンマ区切りで並べて渡すと、まとめて追加できます。基本は「返ってきたスライスを受け取る」点だけ同じです。追加した順番のまま末尾に並ぶので、並び順を保ちたいときにも安心して使えます。
numbers := []int{1, 2}
numbers = append(numbers, 3, 4, 5) // 3つまとめて追加
fmt.Println(numbers) // [1 2 3 4 5]
実行可能な最小例でも確認してみましょう。変数に入っている値や計算結果も、そのまま並べて渡せます(型はスライスの要素型とそろえる必要があります)。
package main
import "fmt"
func main() {
scores := []int{10} // もともと1件
a, b := 20, 30 // 変数の値
scores = append(scores, a, b, 40+5) // まとめて追加&計算結果もOK
fmt.Println("追加後:", scores) // [10 20 30 45]
// 並び順は渡した順に維持される
scores = append(scores, 100, 1)
fmt.Println("順序確認:", scores) // [10 20 30 45 100 1]
}
ポイントは「append(スライス, 値1, 値2, ...)」という形で書き、変数 = append(...)で受け取ること。これだけで、複数の値を一度に足す操作がすっきり書けます。
4. 他のスライスをまとめて追加する方法
別のスライスの要素をまとめて追加したいときは、スライスの前に...を付けます。これは「スライスの中身を全部展開して追加してね」という意味です。
a := []int{1, 2}
b := []int{3, 4, 5}
a = append(a, b...) // bの全要素をaに追加
fmt.Println(a) // [1 2 3 4 5]
5. append関数の内部で起きていること(簡単な解説)
appendはスライスの容量をチェックし、容量が足りなければ新しいメモリを確保してデータをコピーします。だから、スライスは自動的に大きくなっていくのです。
この動きは初心者には少し難しいですが、知っておくとスライスの仕組みが理解しやすくなります。
6. 実際にappendで要素を追加してみる
package main
import "fmt"
func main() {
fruits := []string{"りんご", "みかん"}
fmt.Println(fruits) // [りんご みかん]
fruits = append(fruits, "バナナ")
fmt.Println(fruits) // [りんご みかん バナナ]
moreFruits := []string{"ぶどう", "もも"}
fruits = append(fruits, moreFruits...)
fmt.Println(fruits) // [りんご みかん バナナ ぶどう もも]
}
[りんご みかん]
[りんご みかん バナナ]
[りんご みかん バナナ ぶどう もも]
7. append関数を使うときの注意点
- 必ず戻り値を受け取ること:
appendは新しいスライスを返すので、代入を忘れると元のスライスは変わりません。 - 元のスライスの容量を超えると新しい配列が作られるので、メモリやパフォーマンスに注意が必要な場面もあります。
- スライスの参照特性:appendで新しいスライスが作られることがあるため、複数の変数が同じスライスを参照している場合は挙動に注意してください。
8. 応用例:ユーザー入力でスライスに値を追加する
実際のプログラムでは、ユーザーからの入力を受け取ってスライスに追加することがあります。簡単な例を見てみましょう。
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
var words []string
fmt.Println("好きな言葉を入力してください。終了するにはexitと入力します。")
for {
fmt.Print("> ")
if !scanner.Scan() {
break
}
input := strings.TrimSpace(scanner.Text())
if input == "exit" {
break
}
words = append(words, input)
fmt.Println("現在のリスト:", words)
}
fmt.Println("入力を終了しました。最終リスト:", words)
}
このプログラムでは、ユーザーが入力した言葉をどんどんスライスに追加していきます。exitと入力すると終了します。
まとめ
今回はGo言語のスライス操作におけるappend関数の基本から応用まで、具体的な使い方や注意点、ユーザー入力との組み合わせまで幅広く学びました。appendは、配列のような固定長の制限を超えて、柔軟にデータを扱うための非常に重要な機能です。
特に初心者にとってありがちなミスとして、「戻り値を再代入しない」「容量と参照の違いを理解しない」という点がありますが、本記事の中で紹介した小さなサンプルを使えば、それらも自然に体験しながら理解できます。また、...(ドット3つ)を使ったスライス展開の使い方や、bufio.Scannerを使ってユーザー入力を扱う応用例も合わせて覚えておくと、日常的なプログラムでも即戦力になるでしょう。
Go言語はシンプルで高速な構文が特徴ですが、そのぶん一つ一つの動きが明確であり、理解が深まるほどコードの質も上がります。今回学んだappend関数の性質を押さえておくだけで、データ構造の扱いに関する柔軟さと堅牢さがぐっと増します。
append関数で複数のユーザー入力をまとめて処理するサンプル
たとえば、ユーザーが好きな動物を入力して、最後に一覧表示するプログラムを考えてみましょう。
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main() {
var animals []string
scanner := bufio.NewScanner(os.Stdin)
fmt.Println("好きな動物を入力してください(終了は end):")
for {
fmt.Print("> ")
if !scanner.Scan() {
break
}
input := strings.TrimSpace(scanner.Text())
if input == "end" {
break
}
if input != "" {
animals = append(animals, input)
}
}
fmt.Println("入力された動物リスト:")
for i, a := range animals {
fmt.Printf("%d: %s\n", i+1, a)
}
}
上記のように、Go言語のappendは日常的なユーザー操作と組み合わせることで、非常に実用的なデータ収集ツールにもなります。
生徒
「appendってただ足すだけかと思ってたけど、実は戻り値をちゃんと受け取らないといけないんですね!」
先生
「その通り!appendは新しいスライスを返す仕組みだから、変数に再代入しないと追加された結果が反映されないんだ。」
生徒
「あと、容量が足りないと新しいメモリに引っ越すっていうのも、最初は気付きにくかったです。」
先生
「そこも重要なポイントだね。特に複数のスライス変数を扱うときは、参照の共有やコピーにも注意が必要になるよ。」
生徒
「append(...b)みたいに他のスライスを展開して渡せるのも便利でした。今度、入力した値をまとめて処理するときに使ってみます!」
先生
「いい心がけだね。appendの使い方をしっかり理解しておけば、Go言語のスライス操作は怖くないよ!」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語のスライスと配列の違いがよくわかりません。append関数は配列には使えないのですか?
Go言語の配列は最初に決めた長さを変えられない固定サイズのデータ構造ですが、Go言語のスライスは動的にサイズを増やせる柔軟なデータ構造です。append関数はスライス専用で、配列には直接使えません。append関数はスライスに新しい要素を追加し、必要に応じて容量を自動で増やしてくれるため、Go言語の実践的なプログラミングではスライスとappendを組み合わせて使うことが一般的です。
append関数を使うときに、なぜイコールで代入し直さないといけないのですか?
appendは新しいスライスを返す仕組みになっているため、イコールで受け取らずにappendを呼び出すだけでは元のスライスに変化が反映されません。初心者がよくある間違いとしてappendを呼んでも値が増えていないパターンがありますが、正しく動かすにはGo言語のスライスを再代入することが重要です。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!