Код 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
Нажмите ❤ ниже, чтобы помочь другим узнать эту историю. Если вы хотите получать обновления о новых сообщениях, подписывайтесь на меня.