什么是符文?
Go的rune
是什么?
我一直在Google上search,但Golang只在一行中说: rune
是int32
的别名 。
但是如何使用整数像交换的情况一样?
以下是一个函数swapcase。 什么是所有<=
和-
?
为什么不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) }
我明白这是将rune
映射到string
以便它可以返回交换的string。 但我不明白在这里完全rune
或byte
作品。
符文文字只是一个整数值(如你所写)。 他们被“映射”到他们的unicode codepoint。 例如,规则字面值“a”实际上是97。
因此,您的程序几乎等同于:
package main import "fmt" func SwapRune(r rune) rune { switch { case 97 <= r && r <= 122: return r - 32 case 65 <= r && r <= 90: return r + 32 default: return r } } func main() { fmt.Println(SwapRune('a')) }
这应该是显而易见的,如果你看看unicode映射,这是相同的ASCII在该范围内。 32是大写和小写字符的偏移量。 所以如果你把32加到'A'上,你会得到'a',反之亦然。
从Go lang发行说明: http : //golang.org/doc/go1#rune
符文是一种types。 它占用32位,是为了代表一个Unicode CodePoint 。 作为一个类比,用ASCII编码的英文字符集有128个编码点。 因此能够适应一个字节(8位)。 从这个(错误的)假设C将字符视为“字节” char
,将“string”视为“ char*
序列” char*
。
但猜猜怎么了。 除了'abcde ..'符号之外,还有许多人类发明的其他符号。 而且有很多我们需要32位来编码它们。 在golang中,一个string
是一个runes
序列。
unicode软件包http://golang.org/pkg/unicode/可以体现挑战的丰富性。;
我没有足够的信誉来发表评论fabrizioM的答案,所以我将不得不在这里发布。
法布里奇奥的回答基本上是正确的,他肯定抓住了这个问题的本质 – 尽pipe有一个必须作出的区分。
一个string不一定是一个符文序列。 它是一个“字节片段”的封装,片断是一个Go数组的封装。 这有什么不同?
一个符文必然是一个32位的值,这意味着符文序列必然会有一些位x * 32。 string是一个字节序列,长度为x * 8位。 如果所有string实际上都是Unicode的,那么这个差别就不会有影响。 由于string是字节片,所以Go可以使用ASCII或其他任意字节编码。
但是,string文字必须写入以UTF-8编码的源文件中。
信息来源: http : //blog.golang.org/strings
我尽量保持我的语言简单,让一个外行人理解rune
。
符文是一个字符。 而已。
这是一个单一的字符。 这是来自世界各地任何语言的任何字母的字符。
获取我们使用的string
double-quotes ""
要么
back-ticks ``
一个string不同于一个符文。 在我们使用的符文
single-quotes ''
现在一个符文也是int32
的别名…呃什么?
符文是int32
的别名的原因是因为我们看到,如下面的编码scheme
每个字符映射到一些数字,所以这是我们正在存储的数字。 例如, 一个映射到97 ,当我们存储这个数字,它只是数字,所以这是符文是int32的别名。 但不只是任何数字。 它是一个32'零和1'或'4'字节的数字。 (注意:UTF-8是一个4字节的编码scheme)
符文与string有什么关系?
一个string是符文的集合。 在下面的代码中:
package main import ( "fmt" ) func main() { fmt.Println([]byte("Hello")) }
我们尝试将string转换为字节stream。 输出是:
[72 101 108 108 111]
我们可以看到构成该string的每个字节都是符文。
其他人已经涵盖了与符文有关的部分,所以我不打算谈论这个。
但是,也有一个问题涉及到没有任何参数的switch
。 这只是因为在Golang中,没有expression式的switch
是expressionif / 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") }
你可以在这里阅读更多。