什么是符文?

Go的rune是什么?

我一直在Google上search,但Golang只在一行中说: runeint32的别名

但是如何使用整数像交换的情况一样?

以下是一个函数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。 但我不明白在这里完全runebyte作品。

符文文字只是一个整数值(如你所写)。 他们被“映射”到他们的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") } 

你可以在这里阅读更多。