276

runeGoの a とは何ですか?

私はグーグルで調べてきましたが、Golangは1行でしか言いません: runeis an alias forint32 .

しかし、スワッピング ケースのように整数があちこちで使用されるのはなぜでしょうか?

以下は関数のスワップケースです。すべての<=とは何-ですか?

そして、なぜ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正確にはわかりません。runebyte

4

9 に答える 9

205

ルーン リテラルは 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'))
}

その範囲ではASCIIと同じである Unicode マッピングを見れば明らかです。さらに、32 は実際には、文字の大文字と小文字のコードポイント間のオフセットです。したがって、 に追加32する'A'と が得られ'a'、その逆も同様です。

于 2013-10-11T05:58:28.720 に答える
77

Go 言語のリリース ノートから: http://golang.org/doc/go1#rune

ルーンはタイプです。これは 32 ビットを占有し、 Unicode CodePointを表すことを意図しています。類推として、「ASCII」でエンコードされた英語の文字セットには 128 のコード ポイントがあります。したがって、バイト (8 ビット) 内に収まることができます。この (誤った) 仮定から、C は文字を 'bytes' として扱いchar、'strings' を 'sequence of characters' として扱いましたchar*

しかし、何を推測します。「abcde..」記号以外にも、人間が発明した記号は他にもたくさんあります。そして、それらをエンコードするには 32 ビットが必要なほど多くあります。

golang では、 astringは のシーケンスですbytes。ただし、複数のバイトでルーンのコードポイントを表すことができるため、文字列値にルーンを含めることもできます。したがって、 に変換することも[]rune、その逆も可能です。

Unicode パッケージhttp://golang.org/pkg/unicode/は、チャレンジの豊かさを味わうことができます。

于 2013-10-11T19:28:46.677 に答える
39

fabrizioM's answerにコメントを投稿するのに十分な評判がないため、代わりにここに投稿する必要があります。

ファブリツィオの答えはおおむね正しく、彼は問題の本質を確実にとらえていました。

文字列は必ずしも一連のルーン文字ではありません。これは「バイトのスライス」のラッパーであり、スライスは Go 配列のラッパーです。これはどのような違いをもたらしますか?

ルーン型は必ず 32 ビット値です。つまり、ルーン型の一連の値は必ず x*32 のビット数を持つことになります。一連のバイトである文字列は、代わりに x*8 ビットの長さを持ちます。すべての文字列が実際に Unicode である場合、この違いは影響しません。ただし、文字列はバイトのスライスであるため、Go は ASCII またはその他の任意のバイト エンコーディングを使用できます。

ただし、文字列リテラルは、UTF-8 でエンコードされたソースに書き込む必要があります。

情報源: http://blog.golang.org/strings

于 2015-07-08T17:31:04.760 に答える