围棋中的符文是什么?
我一直在谷歌,但Golang只说了一行:符文是int32的别名。
但是为什么整数会像交换一样被广泛使用呢?
下面是一个函数交换案例。
所有的<=和-是什么?
为什么switch没有参数呢?
&&应该表示和,但是r <= 'z'是什么?
func SwapRune(r rune) rune {
switch {
case 'a' <= r && r <= 'z':
return r - 'a' + 'A'
case 'A' <= r && r <= 'Z':
return r - 'A' + 'a'
default:
return r
}
}
其中大部分来自http://play.golang.org/p/H6wjLZj6lW
func SwapCase(str string) string {
return strings.Map(SwapRune, str)
}
我明白这是映射符文到字符串,以便它可以返回交换的字符串。但我不明白符文或字节在这里是如何工作的。
来自Go lang发布说明:http://golang.org/doc/go1#rune
符文是一种类型。它占用32位,用于表示Unicode代码点。
作为一个类比,用“ASCII”编码的英语字符集有128个码位。这样就可以装进一个字节(8位)。根据这个(错误的)假设,C将字符视为'bytes' char,将'strings'视为'sequence of characters' char*。
但你猜怎么着。除了abcde,人类还发明了许多其他的符号。的符号。有太多了,我们需要32位来编码它们。
在golang中,字符串是一个字节序列。然而,由于多个字节可以表示一个符文代码点,字符串值也可以包含符文。所以,它可以转换为[]符文,反之亦然。
unicode包http://golang.org/pkg/unicode/可以让你体验到挑战的丰富程度。
程序
package main
import (
"fmt"
)
func main() {
words := "€25 or less"
fmt.Println("as string slice")
fmt.Println(words, len(words))
runes := []rune(words)
fmt.Println("\nas []rune slice")
fmt.Printf("%v, len:%d\n", runes, len(runes))
bytes := []byte(words)
fmt.Println("\nas []byte slice")
fmt.Printf("%v, len:%d\n", bytes, len(bytes))
}
输出
as string slice
€25 or less 13
as []rune slice
[8364 50 53 32 111 114 32 108 101 115 115], len:11
as []byte slice
[226 130 172 50 53 32 111 114 32 108 101 115 115], len:13
如您所见,欧元符号“€”由3个字节表示——226、130和172。
符文代表一个字符-任何字符,它是象形文字。一个符文的32位足以代表当今世界上所有的字符。因此,欧元符号“€”的符文表示是8364。
对于128个ASCII字符,一个字节(8位)就足够了。因此,符文和数字或字母的字节表示是相同的。例:2用50表示。
字符串的字节表示总是大于或等于其符文表示的长度,因为某些字符用超过一个字节表示,但不超过32位,这是一个符文。
https://play.golang.org/p/y93woDLs4Qe
其他所有人都已经介绍了与符文相关的部分,所以我不打算谈论这个。
然而,还有一个关于开关没有任何参数的问题。这只是因为在Golang中,没有表达式的switch是表达if/else逻辑的另一种方式。例如,这样写:
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
和写这个是一样的
t := time.Now()
if t.Hour() < 12 {
fmt.Println("It's before noon")
} else {
fmt.Println("It's after noon")
}
你可以在这里阅读更多。
来自Go lang发布说明:http://golang.org/doc/go1#rune
符文是一种类型。它占用32位,用于表示Unicode代码点。
作为一个类比,用“ASCII”编码的英语字符集有128个码位。这样就可以装进一个字节(8位)。根据这个(错误的)假设,C将字符视为'bytes' char,将'strings'视为'sequence of characters' char*。
但你猜怎么着。除了abcde,人类还发明了许多其他的符号。的符号。有太多了,我们需要32位来编码它们。
在golang中,字符串是一个字节序列。然而,由于多个字节可以表示一个符文代码点,字符串值也可以包含符文。所以,它可以转换为[]符文,反之亦然。
unicode包http://golang.org/pkg/unicode/可以让你体验到挑战的丰富程度。