package main

import "fmt"

func main() {
	// a menjadi backing array yang dibagi oleh s1 dan s2.
	a := []int{1, 2, 3, 4, 5}
	s1 := a[1:4] // [2 3 4], berbagi backing array dengan a
	s2 := a[2:5] // [3 4 5], berbagi backing array dengan a
	fmt.Println("awal  s1:", s1, "s2:", s2)

	// Tulis lewat s2, perubahan terlihat dari s1 dan a.
	s2[0] = 99
	fmt.Println("s2[0] = 99")
	fmt.Println("s1   :", s1)
	fmt.Println("s2   :", s2)
	fmt.Println("a    :", a)

	// append di dalam kapasitas menimpa slot backing array milik slice lain.
	b := make([]int, 3, 6)
	b[0], b[1], b[2] = 1, 2, 3
	sisiLain := b[:3]
	sisiLain = append(sisiLain, 80)
	fmt.Println("setelah sisiLain append 80:", sisiLain)
	b = append(b, 70)
	fmt.Println("setelah b append 70      :", b)
	fmt.Println("sisiLain                 :", sisiLain)

	// Solusi: salin agar tidak berbagi backing array.
	salinan := make([]int, len(s1))
	copy(salinan, s1)
	salinan[0] = 7
	fmt.Println("salinan[0] = 7")
	fmt.Println("s1     :", s1)
	fmt.Println("salinan:", salinan)

	// Full slice expression a[low:high:max] membatasi cap.
	terbatas := a[1:4:4] // len 3, cap 3, tidak bisa tumbuh
	terbatas = append(terbatas, 500)
	fmt.Println("terbatas:", terbatas)
	fmt.Println("a       :", a)
}
