Код Go закодирован в UTF-8

Unicode неплохо работает с Golang. Программисту не нужно каким-либо образом маркировать строки Unicode:

package main
import "fmt"
func main() {
    fmt.Println("嗨")
    fmt.Println("Cześć")
    fmt.Println("Hello")
}

так что code печатает то, что ожидается:

嗨
Cześć
Hello

В приведенной выше программе используются интерпретированные строковые литералы (заключенные в двойные кавычки). Те же свойства кодирования применяются к необработанным строковым литералам, заключенным в обратные кавычки (код):

package main
import "fmt"
func main() {
    fmt.Println(`嗨
Cześć\n\n\n
Hello`)
}

Вывод:

嗨
Cześć\n\n\n
Hello

Необработанные строковые литералы могут содержать символы новой строки, обратная косая черта не интерпретируется каким-либо особым образом, а символы возврата каретки (\ r) отбрасываются.

Менее известно, что все содержимое файлов .go закодировано в UTF-8. Принимая во внимание также тот факт, что идентификатор состоит из букв и цифр (где первой всегда является буква), а буква - это произвольная кодовая точка Unicode, тогда:

package main
import "fmt"
func 隨機名稱() {
    fmt.Println("It works!")
}
func main() {
    隨機名稱()
    źdźbło := 1
    fmt.Println(źdźbło)
}

полностью действующая программа производства:

It works!
1

Помимо строковых литералов или идентификаторов, символы, отличные от ASCII, также могут отображаться в комментариях:

name := "Michał" // Michał == Michael
fmt.Println(name)

Реализация лексера Голанга (он же сканер или токенизатор) помещается внутри cmd / compile / internal / syntax / scanner.go.

play.golang.org не интерпретирует \r, поэтому программа:

package main
import "fmt"
func main() {
    fmt.Printf("foo")
    fmt.Printf("\r")
    fmt.Printf("bar\n")
}

дает там:

foo
bar

GNU Bash справляется с этим правильно:

> go run foo.go
bar

Нажмите ❤ ниже, чтобы помочь другим узнать эту историю. Если вы хотите получать обновления о новых сообщениях, подписывайтесь на меня.

Ресурсы