Это пример untyped constants. Из документов:
Нетипизированные булево, числовые и строковые константы могут быть использованы в качестве операндов везде, где это допустимо использовать операнд логического, числового или строкового типа, соответственно. За исключением операций сдвига, если операндами двоичной операции являются разные типы нетипизированных констант, операция и для небулевых операций результат использует вид, который появляется позже в этом списке: целое число, руна, с плавающей запятой, комплекс ,
С 'a'
является нетипизированной константой, компилятор попытается преобразовать ее в тип, сопоставимый с другим операндом. В этом случае он преобразуется в byte
.
Вы можете увидеть, что это не работает, когда постоянная руна не помещается в один байт:
package main
import (
"fmt"
)
func main() {
const a = '€'
fmt.Println("a"[0] == a) // constant 8364 overflows byte
}
https://play.golang.org/p/lDN-SERUgN