Golang supports assigning multiple return values to multiple left hand side variables. E.g:

func test() (string, string) {
  return "1", "1"
}

a, b := test()

or

a, _ := test()

and the number of receiving variables and return values must match:

b = test()   //wrong

But for some built-in types, such as [] or <-, a variable number of return values are supported

key, exist := map[key]

key := map[key]

I can read value from channel like this

c <- myChan

c, exist <- myChan

How can we explain the inconsistency? Is this a capability reserved to the core go runtime/language?