TL;DR
文字列や配列、スライスから、インデックスの範囲を指定して部分を取り出す操作。Go では a[low:high] のようなスライス式で書く。
仕組み
Go のスライス式 a[low:high] は、インデックス low から high の手前までの要素を持つ、長さ high - low の部分文字列またはスライスを作る。low を省略すると 0、high を省略すると a の長さになる。
結果がスライスのとき、元のスライスや配列と基底配列を共有する。そのため、結果の要素を書き換えると元の要素も変わる。
キャパシティも指定したいときは、完全スライス式 a[low:high:max] を使う。
例
a := [5]int{1, 2, 3, 4, 5}
s := a[1:4] // [2 3 4]、長さ 3、キャパシティ 4
a[2:] // a[2:len(a)] と同じ
a[:3] // a[0:3] と同じ
a[:] // a[0:len(a)] と同じ注意点
仕様では、配列と文字列のインデックスは 0 <= low <= high <= len(a) を満たすときに範囲内となる。スライスでは、上限が長さではなくキャパシティ cap(a) になる。実行時に範囲外のインデックスを指定すると、パニックが起きる。
文字列をスライスした結果は、元と同じ型の文字列になる。配列をスライスするときは、その配列がアドレス可能でなければならない。nil スライスをスライスした結果は nil スライスになる。