Edit: as of Go 1.17+, you may be able to use new support for slice-to-array conversions, https://tip.golang.org/ref/spec#Conversions_from_slice_to_array_pointer:
s := make([]byte, 2, 4)
s0 := (*[0]byte)(s) // s0 != nil
s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1]
s2 := (*[2]byte)(s) // &s2[0] == &s[0]
s4 := (*[4]byte)(s) // panics: len([4]byte) > len(s)
Previous answer for Go 1.16 and below:
You need to use copy:
slice := []byte("abcdefgh")
var arr [4]byte
copy(arr[:], slice[:4])
fmt.Println(arr)
As Aedolon notes you can also just use
copy(arr[:], slice)
as copy will always only copy the minimum of len(src) and len(dst) bytes.