diff --git a/16-slices/10-slice-internals-3-len-cap/1-theory/main.go b/16-slices/10-slice-internals-3-len-cap/1-theory/main.go new file mode 100644 index 0000000..e6b3506 --- /dev/null +++ b/16-slices/10-slice-internals-3-len-cap/1-theory/main.go @@ -0,0 +1,31 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + "fmt" + + s "github.com/inancgumus/prettyslice" +) + +func main() { + s.MaxPerLine = 6 + s.PrintBacking = true + + ages := []int{35, 15, 25} + s.Show("ages", ages) + + s.Show("ages[0:0]", ages[0:0]) + + for i := 1; i < 4; i++ { + txt := fmt.Sprintf("ages[%d:%d]", 0, i) + s.Show(txt, ages[0:i]) + } + + s.Show("append", append(ages, 50)) +} diff --git a/16-slices/10-slice-internals-3-len-cap/2-example/main.go b/16-slices/10-slice-internals-3-len-cap/2-example/main.go new file mode 100644 index 0000000..7c43578 --- /dev/null +++ b/16-slices/10-slice-internals-3-len-cap/2-example/main.go @@ -0,0 +1,56 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + s "github.com/inancgumus/prettyslice" +) + +func main() { + s.PrintBacking = true + + // ---------------------------------------------------- + // #1 nil slice + var games []string // nil slice + s.Show("games", games) + + // ---------------------------------------------------- + // #2 empty slice + games = []string{} // empty slice + s.Show("games", games) + // s.Show("another empty", []int{}) + + // ---------------------------------------------------- + // #3 non-empty slice + games = []string{"pacman", "mario", "tetris", "doom"} + s.Show("games", games) + + // ---------------------------------------------------- + // #4 reset the part using the games slice + // part is empty but its cap is still 4 + part := games + s.Show("part", part) + + part = games[:0] + s.Show("part[:0]", part) + s.Show("part[:cap]", part[:cap(part)]) + + for cap(part) != 0 { + part = part[1:cap(part)] + s.Show("part", part) + } + + // #6 backing array's elements become inaccessible + // games = games[len(games):] + + // ---------------------------------------------------- + // #5 part doesn't have any more capacity + // games slice is still intact + s.Show("part", part) + s.Show("games", games) +} diff --git a/16-slices/11-slice-internals-4-append/1-theory/main.go b/16-slices/11-slice-internals-4-append/1-theory/main.go new file mode 100644 index 0000000..7386edb --- /dev/null +++ b/16-slices/11-slice-internals-4-append/1-theory/main.go @@ -0,0 +1,22 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + s "github.com/inancgumus/prettyslice" +) + +func main() { + s.PrintBacking = true + + ages := []int{35, 15} + s.Show("ages", ages) + + ages = append(ages, 5) + s.Show("append(ages, 5)", ages) +} diff --git a/16-slices/11-slice-internals-4-append/2-example/main.go b/16-slices/11-slice-internals-4-append/2-example/main.go new file mode 100644 index 0000000..11a1125 --- /dev/null +++ b/16-slices/11-slice-internals-4-append/2-example/main.go @@ -0,0 +1,54 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + s "github.com/inancgumus/prettyslice" +) + +func main() { + s.PrintBacking = true + + // #1: a nil slice has no backing array + var nums []int + s.Show("no backing array", nums) + + // #2: creates a new backing array + nums = append(nums, 1, 3) + s.Show("allocates", nums) + + // #3: creates a new backing array + nums = append(nums, 2) + s.Show("free capacity", nums) + + // #4: uses the same backing array + nums = append(nums, 4) + s.Show("no allocation", nums) + + // GOAL: append new odd numbers in the middle + // [1 3 2 4] -> [1 3 7 9 2 4] + + // #6: [1 3 2 4] -> [1 3 2 4 2 4] + nums = append(nums, nums[2:]...) + s.Show("nums <- nums[2:]", nums) + + // #5: overwrites: [1 3 2 4 2 4] -> [1 3 7 9] + nums = append(nums[:2], 7, 9) + s.Show("nums[:2] <- 7, 9", nums) + + // #7: [1 3 7 9] -> [1 3 7 9 2 4] + nums = nums[:6] + s.Show("nums: extend", nums) +} + +// don't mind about these options +// they're just for printing the slices nicely +func init() { + s.MaxPerLine = 10 + s.Width = 45 +} diff --git a/16-slices/11-slice-internals-4-append/3-example-growth/main.go b/16-slices/11-slice-internals-4-append/3-example-growth/main.go new file mode 100644 index 0000000..1df92ff --- /dev/null +++ b/16-slices/11-slice-internals-4-append/3-example-growth/main.go @@ -0,0 +1,34 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + "math/rand" + "time" + + s "github.com/inancgumus/prettyslice" + "github.com/inancgumus/screen" +) + +func main() { + s.PrintBacking = true + s.MaxPerLine = 30 + s.Width = 150 + + var nums []int + + screen.Clear() + for cap(nums) <= 128 { + screen.MoveTopLeft() + + s.Show("nums", nums) + nums = append(nums, rand.Intn(9)+1) + + time.Sleep(time.Second / 4) + } +} diff --git a/16-slices/11-slice-internals-4-append/4-example-growth/main.go b/16-slices/11-slice-internals-4-append/4-example-growth/main.go new file mode 100644 index 0000000..94b7c1a --- /dev/null +++ b/16-slices/11-slice-internals-4-append/4-example-growth/main.go @@ -0,0 +1,27 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + "fmt" +) + +func main() { + ages, oldCap := []int{1}, 1. + + for len(ages) < 5e5 { + ages = append(ages, 1) + + c := float64(cap(ages)) + if c != oldCap { + fmt.Printf("len:%-10d cap:%-10g growth:%.2f\n", + len(ages), c, c/oldCap) + } + oldCap = c + } +}