From 1cceb00a34c7117f07e6a79ba17bb08ee3c67fac Mon Sep 17 00:00:00 2001 From: Marcus Noble Date: Fri, 30 Oct 2020 13:13:02 +0000 Subject: [PATCH] Update 'content/posts/golang-append.md' --- content/posts/golang-append.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/content/posts/golang-append.md b/content/posts/golang-append.md index 284ec08..985f7ac 100644 --- a/content/posts/golang-append.md +++ b/content/posts/golang-append.md @@ -33,3 +33,29 @@ func main() { ``` This is _only_ an issue when the resulting array is shorter than the array passed in as the first parameter. + +**Update:** +It turns out this is expected behavior (see https://github.com/golang/go/issues/28780#issuecomment-438428780) and a side-effect of how slices work in Go. + +A slice (what we're producing when using the `[:2]`) can be thought of as a view onto an array. So when making changes to a slice you're really just making changes to that part of the array it is pointed to. By default slices are dynamic in size so if you go past the end of the slice you still continue along the array if it has more entries. + +To avoid this happening you can specify a third value in the slice that sets the fixed length of the slice. E.g. + +```go +package main + +import "fmt" + +func main() { + first := []int{0, 1, 2, 3, 4, 5, 6} + second := []int{4, 5, 6} + + fmt.Println(first) + // -> [0 1 2 3 4 5 6] + fmt.Println(append(first[:2:2], second...)) + // -> [0 1 4 5 6] + fmt.Println(first) + // -> [0 1 2 3 4 5 6] + fmt.Println("Much better :)") +} +``` \ No newline at end of file