围棋中的符文是什么?

我一直在谷歌,但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)
}

我明白这是映射符文到字符串,以便它可以返回交换的字符串。但我不明白符文或字节在这里是如何工作的。


当前回答

我没有足够的声誉在fabrizioM的答案上发表评论,所以我只能在这里发表。

法布里齐奥的回答在很大程度上是正确的,他当然抓住了问题的本质——尽管必须加以区分。

字符串不一定是一系列符文。它是一个“字节切片”的包装器,切片是一个Go数组的包装器。这又有什么区别呢?

一个符文类型必须是一个32位的值,这意味着符文类型的值序列必须有一定数量的位x*32。字符串是一个字节序列,长度为x*8位。如果所有字符串实际上都是Unicode,那么这种差异将没有影响。然而,由于字符串是字节的切片,Go可以使用ASCII或任何其他任意字节编码。

然而,字符串字面量必须写入以UTF-8编码的源文件中。

信息来源:http://blog.golang.org/strings

其他回答

程序

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

我尽量使我的语言简单,这样外行也能理解符文。

符文是一个字符。就是这样。

它是一个单一的字符。它是来自世界上任何地方任何语言的任何字母表中的一个字符。

来获取我们使用的字符串

double-quotes ""

OR

back-ticks ``

字符串不同于符文。在我们使用的符文中

single-quotes ''

现在一个符文也是int32的别名…嗯什么?

rune是int32的别名的原因是我们在如下的编码方案中看到的

每个字符映射到一个数字,所以这就是我们要存储的数字。例如,a映射到97,当我们存储这个数字时,它只是一个数字,这就是rune是int32的别名的方式。但不是任何数字。它是一个有32个“0和1”或“4”字节的数字。(注意:UTF-8是一个4字节编码方案)

符文和字符串有什么关系?

字符串是符文的集合。在以下代码中:

    package main

    import (
        "fmt"
    )

    func main() {
        fmt.Println([]byte("Hello"))
    }

我们尝试将字符串转换为字节流。输出结果为:

[72 101 108 108 111]

我们可以看到,组成该字符串的每个字节都是一个符文。

符文是一个int32值,因此它是一种Go类型,用于表示Unicode码位。Unicode码位是通常用于表示单个Unicode字符的数值;

符文文字只是32位整数值(但是它们是无类型的常量,所以它们的类型可以改变)。它们代表unicode码点。例如,符文文字“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实际上是字符的大写和小写码位之间的偏移量。所以A加32,就得到A,反之亦然。

来自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/可以让你体验到挑战的丰富程度。