下記のコードにおいて、(2)はOKで、(3)がruntime errorになるのはどのような理由によるものでしょうか? Goのバージョンは"go1.11 darwin/amd64"です。

package main

import "fmt"

func main() {
    a := "a"
    fmt.Println(a[:len(a)])      // (1) "a"
    fmt.Println(a[len(a):])      // (2) ""
    // fmt.Println(a[len(a)])    // (3) panic - index out of range
    // fmt.Println(a[len(a)+1:]) // (4) panic - slice bounds out of range
}