围棋中的符文是什么?

我一直在谷歌,但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/可以让你体验到挑战的丰富程度。

其他回答

符文文字只是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/可以让你体验到挑战的丰富程度。

其他所有人都已经介绍了与符文相关的部分,所以我不打算谈论这个。

然而,还有一个关于开关没有任何参数的问题。这只是因为在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")
}

你可以在这里阅读更多。

Rune是int32的别名,在所有方面都等价于int32。它是 用于区分字符值和整数值。

L = 108, o = 111

Rune是int32类型的别名。它表示一个单一的Unicode码位。 统一码联盟(Unicode Consortium)为超过100万个独特的字符分配数字值,称为码点。例如,65是字母A的码位,66 -> B (来源:Get Programming with Go)