「GoLang」文字列と関連操作

ディレクトリ

1.文字列の概要

  • 二重引用符:文字列は二重引用符で囲まれ、関連するエスケープ文字が置き換えられます

    str := "Hello World! \n Hello Gopher! \n"
    

    出力:

    Hello World! 
    Hello Gopher!
    
  • バックティック:文字列はバックティックで囲まれ、関連するエスケープ文字は置き換えられません

    str :=  `Hello World! \n Hello Gopher! \n`
    

    出力:

    Hello World! \nHello Gopher! \n
    

二重引用符のエスケープ文字は、抗ネイティブに引用符で囲まれた文字列は、交換される\n ことがあるとして出力されます。

stringタイプ0の値は長さ0の文字列で、空の文字列 ""です

Goのstringタイプは値タイプであり、格納されている文字列は不変です。コンテンツを変更する場合はstringstring[]byte[]runestringまたは変換する必要があり、変更されたコンテンツは再配布されます。

関数len()使用して、文字列の長さをバイト単位で取得できます

str := "asd"
len(str)

文字を取得する必要がある場合は、次のようにする必要があります。

package main

import "fmt"

func main() {
    str := "我与春风皆过客,你携秋水揽星河。"
	for _, char := range str {
		fmt.Printf("%c", char)
	}
}

出力:

我与春风皆过客,你携秋水揽星河。

行動のバイトアドレスの文字列が違法である取得しますたとえば、: &str[i]

2.文字列の連結

  • 演算子を直接使用する

    str := "Beginning of the string " + 
    	"second part of the string"
    

    ラインコンパイラの終わりから自動的に全体の理由セミコロンを記入し、プラス記号は、+最初の行に配置する必要があります。

    速記スプライシングは+=また、文字列です。

    s := "hel" + "lo, "
    s += "world!"
    fmt.Println(s) // 输出 “hello, world!”
    

    内部の文字列は不変であり、各操作は新しい文字列を生成するため、役に立たないだけでなく、GCに追加の負荷もたらすため、パフォーマンスが比較的低くなります。

  • fmt.Sprintf()

    str := fmt.Sprintf("%d:%s", 2018, "年")
    fmt.Println(str) // 2018:年
    

    内部には、[]byte直接、オペレータは、このような一時的な文字列の多くを持つことになりますが、内部ロジックが複雑であるとは異なり、多くの追加的な判断も用途があり、実装interface、一般的にパフォーマンスが。

  • strings.Join()

    str = strings.Join([]string{"hello", "world"}, ", ")
    fmt.Println(str) // hello, world
    

    Join文字列配列の内容に応じて、接合後の長さが計算され、対応するメモリサイズが適用されます。1つの文字列が埋められます。配列の場合、この効率は非常に高くなりますが、このデータを構築するコストは少なくありません。

  • bytes.Buffer

    var buffer bytes.Buffer
    buffer.WriteString("hello")
    buffer.WriteString(", ")
    buffer.WriteString("world")
    
    fmt.Print(buffer.String()) // hello, world
    

    これは文字列の長さ推定あれば、あなたが使用することができ、メモリの最適化のために使用する変数の文字も増加としてそれを使用することができ、理想的なbuffer.Grow()セットにインターフェースをcapacity

  • strings.Builder

    var b1 strings.Builder
    b1.WriteString("ABC")
    b1.WriteString("DEF")
    
    fmt.Print(b1.String()) // ABCDEF
    

    strings.Builder内部によってslice保存し、コンテンツを管理します。slice内部的には、ポインターは実際にコンテンツを保持する配列を指します。strings.Builderまた、それは提供してGrow()サポートに事前に定義された能力を。我々は、我々が使用する必要がある容量を事前に定義することができたとき、strings.Builderあなたは新しい拡張と作成を避けることができますslicestrings.Builder非スレッドセーフ、およびパフォーマンスはbytes.Bufferほぼ同じです。

3.文字列の一般的な処理

:4つの標準ライブラリのパッケージには、文字列操作のために特に重要であるがありbytesstringsstrconvそしてunicodeパッケージが。

  • stringsパッケージは、多くの提供するクエリ文字列、置換、比較、カット、スプリットおよびマージ機能を
  • bytesパッケージには、多くの機能に類似の機能を提供しますが、文字列のと同じ構造の持つ[]byteタイプを。文字列は読み取り専用であるため、文字列を徐々に作成すると、多くの割り当てとコピーが発生します。この場合、bytes.Buffertypeを使用するとより効果的です
  • strconv このパッケージは、ブール、整数、浮動小数点、および対応する文字列間の変換を提供し、二重引用符のエスケープに関連する変換も提供します
  • unicodeパッケージの提供はIsDigitIsLetterIsUpperおよびIsLowerおよび他の同様の機能、彼らは分類文字に使用されています

3.1文字列パッケージ

3.1.1 2つのUTF-8エンコードされた文字列が同じかどうかを判断する

  • func EqualFold(s, t string) bool

unicode3つの形式のタイトル文字と同じとみなさ大文字、小文字、

func main() {
    str1 := "Golang"
    str2 := "golang"
    fmt.Println(strings.EqualFold(str1, str2)) // true
}

3.1.2文字列strがプレフィックスで始まるかどうかを判断する

  • strings.HasPrefix(s string,prefix string) bool
func main() {
    str := "哈利·波特"
    prefix := "哈利"
    res := strings.HasPrefix(str, prefix)
    fmt.Println(res) // true
}

3.1.3文字列strがサフィックスで終了しているかどうかを判断する

  • strings.HasSuffix(str string,suffix string) bool
func main() {
    str := "哈利·波特"
    prefix := "波特"
    res := strings.HasSuffix(str, prefix)
    fmt.Println(res) // true
}

3.1.4 sがstrで最初に出現する位置を決定し、出現しない場合は-1を返す

  • strings.Index(str string,s string) int
func main() {
    str := "哈利·波特"
    s := "波特"
    res := strings.Index(str, s)
    fmt.Println(res) // 8,这是字节的index,不是Unicode字符数组的index
}

3.1.5 str内で最後に出現するsの位置を特定し、出現しない場合は-1を返す

  • strings.LastIndex(str tring, s string) int
func main() {
    str := "哈利·波特"
    s := "·"
    res := strings.LastIndex(str, s)
    fmt.Println(res) // 6,这是字节的index,不是Unicode字符数组的index
}

3.1.6親文字列内の非ASCIIエンコード文字の位置を照会する

  • func IndexRune(s string, r rune) int
func main() {
    str := "哈利·波特"
    s := '波'
    res := strings.IndexRune(str, s)
    fmt.Println(res) // 8,这是字节的index,不是Unicode字符数组的index
}

ルーン文字が検索されますが、バイトインデックスが返されます。

3.1.7文字列の置換

  • strings.Replace(str string, old string, newStr string, n int) string

文字列の文字列を返す置換の結果、交換頻度のパラメータ無限のために。stroldnewStrnn<0

func main() {
    str := "I love her, her name is red"
    old := "her"
    newStr := "him"
    res := strings.Replace(str, old, newStr,1)
    fmt.Println(res) // I love him, her name is red
    res = strings.Replace(str, old, newStr,2)
    fmt.Println(res) // I love him, him name is red
    res = strings.Replace(str, old, newStr,-2)
    fmt.Println(res) // I love him, him name is red
}

3.1.8 str内のsubstrの出現回数を返す

  • strings.Count(str string, substr string) int
func main() {
    str := "I love her, her name is red"
    substr := "e"
    count := strings.Count(str, substr)
    fmt.Println(count) // 5
}

3.1.9繰り返しカウントstr

  • strings.Repeat(str string, count int) string
func main() {
    str := "love !"
    count := 3
    res := strings.Repeat(str, count)
    fmt.Println(res) //love!love!love!
}

3.1.10大文字と小文字の変換

  • strings.ToLower(str string) string
  • strings.ToUpper(str string) string
func main() {
    str := "I Love You !"
    lower := strings.ToLower(str)
    upper := strings.ToUpper(str)
    fmt.Println(lower) // i love you !
    fmt.Println(upper) // I LOVE YOU !
}

3.1.11終了スペース文字を削除する

  • strings.TrimSpace(str string) string
func main() {
    str := "I Love You !      "
    res := strings.TrimSpace(str)
    fmt.Println(res) // I Love You !
}

3.1.12 strの両側のカット文字列を削除します

  • strings.Trim(str string, cut string) string
func main() {
    str := "ooI Love You !oo"
    res := strings.Trim(str, "oo")
    fmt.Println(res) // I Love You !
}

3.1.13 strの側面にあるカット文字列を削除します

  • strings.TrimLeft(str string, cut string) string
  • strings.TrimRight(str string, cut string) string

3.1.14 strをスライスに区切るための区切り文字としてスペースを使用する

  • strings.Fields(str string) []string
func main() {
    str := "liu hai zhang"
    res := strings.Fields(str)
    fmt.Println(res)
    for _, x := range res {
        fmt.Println(x)
    }
}

出力結果:

[liu hai zhang]
liu
hai
zhang

3.1.15区切り文字として分割、strをスライスに分割

  • strings.Split(str string,split string) []string
func main() {
    str := "liu-hai-zhuang"
    res := strings.Split(str, "-")
    fmt.Println(res) // [liu hai zhuang]
}

3.1.16 sepを使用してスライス内のすべての要素を文字列に結合する

  • strings.Join(slice []string,sep string) string
func main() {
	slice := []string{"liu", "hai", "zhuang"}
	res := strings.Join(slice, "-")
	fmt.Println(res) // liu-hai-zhuang
}

3.1.17文字列sに部分文字列substrが含まれているかどうかを判別する

  • func Contains(s, substr string) bool
func main() {
    var str = "中国,台湾"
    fmt.Println(strings.Contains(str, "台湾")) //true
    fmt.Println(strings.Contains(str, "日本")) //false
}

3.1.18文字列sにutf-8コード値rが含まれているかどうかを判別する

  • func ContainsRune(s string, r rune) bool
func main() {
    var r rune = '中'
    var str = "中国"
    fmt.Println(strings.ContainsRune(str, r)) //true
    fmt.Println(strings.ContainsRune(str, '日')) //false
}

3.1.19文字列sに文字列charsの文字が含まれているかどうかを判別する

  • func ContainsAny(s, chars string) bool
func main() {
    var s = "我爱你,中国"
    var chars = "我与春风皆过客"
    var test  = "日"

    fmt.Println(strings.ContainsAny(s, chars)) //true
    fmt.Println(strings.ContainsAny(s, test))  //false
}

3.2 bytes 包

メソッドは文字列パッケージに似ていますが、[]byteタイプは指定されていません。ここでは省略しています。ブログhttps://www.cnblogs.com/golove/p/3287729.htmlを参照してください。

3.3 strconvパッケージ

3.3.1文字列から整数

  • func Atoi(s string) (i int, err error)
func main() {
    numStr := "999"
    num, err := strconv.Atoi(numStr)
    if err != nil {
        fmt.Println("can't convert to int")
    } else {
        fmt.Printf("type:%T value:%#v\n", num, num) // type:int value:999
    }
}

また、使用することができstrconv、パッケージを:

func ParseInt(s string, base int, bitSize int) (i int64, err error)

または

func ParseUint(s string, base int, bitSize int) (n uint64, err error)

base指定の六角(2-36)、あればbaseある0、文字列が事前に決定されますから、バンド、バンド、またはバンド;”0x”16”0”810

bitSize結果はなしタイプの割り当て整数指定する必要があり0、オーバーフロー81632、、64表しますintint8int16int32int64

3.3.2 intからstringへ

  • func Itoa(i int) string
func main() {
    num := 200
    numStr := strconv.Itoa(num)
    fmt.Printf("type:%T value:%#v\n", numStr, numStr) // type:string value:"200"
}

3.3.3 boolする文字列

  • func ParseBool(str string) (bool, error)

ときのように:str 、、媒体が真の値であるときのようには: 、、メディアがfalseの場合1tTTRUEtrueTrue
str0fFFALSEfalseFalse

func main() {
    fmt.Println(strconv.ParseBool("t"))    // true
    fmt.Println(strconv.ParseBool("TRUE")) // true
    fmt.Println(strconv.ParseBool("true")) // true
    fmt.Println(strconv.ParseBool("True")) // true
    fmt.Println(strconv.ParseBool("0"))    //false
    fmt.Println(strconv.ParseBool("f"))    //false
}

3.3.4フロートする文字列

  • func ParseFloat(s string, bitSize int) (f float64, err error)

bitSize32または64、システムのビット数に対応

func main() {
    strF := "250.56"
    str, err := strconv.ParseFloat(strF, 64)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("type:%T value:%#v\n", str, str) // type:float64 value:250.56
}

3.3.5 floatからstringへ

  • func FormatFloat(f float64, fmt byte, prec, bitSize int) string

bitSize源は、Fのタイプを示す32float3264float64:)、それに応じて丸めます。

fmtプレゼンテーション'f'形式:-ddd.dddd'b')、 (-ddddp±dddインデックス'e'バイナリ)、 (-d.dddde±dd小数点'E'指数)、 (-d.ddddE±dd小数点指数)、 'g'インデックスが有する大きい'e'形式または'f'フォーマット)、 'G'使用されるインデックスが大きい'E'形式、または'f'フォーマット)。

prec制御精度(負の指数部): 'f'、、'e' 'E'小数点以下の桁数を示し、一対の'g''G'その桁の合計数を制御します。場合precであり-1、それは最小の番号を使用することを意味するが、必要な数字が表すようにf

func main() {
    num := 250.56
    str := strconv.FormatFloat(num, 'f', 4, 64)
    fmt.Printf("type:%T value:%#v\n", str, str) // type:string value:"250.5600"
}

もちろん、上記の型を文字列に変換すれば、そのまま使用できますfmt.Sprintf

3.4 unicode 包

3.4.1文字の大文字と小文字を区別する

  • func IsUpper(r rune) bool
  • func IsLower(r rune) bool

3.4.2大文字と小文字の変換

  • func ToUpper(r rune) rune
  • func ToLower(r rune) rune

3.4.3文字のタイトル形式の判定

// 判断字符 r 是否为 Unicode 规定的 Title 字符
// 大部分字符的 Title 格式就是其大写格式
// 只有少数字符的 Title 格式是特殊字符
// 这里判断的就是特殊字符
func IsTitle(r rune) bool

3.4.4文字変換タイトル形式

  • func ToTitle(r rune) rune

3.4.5文字を指定された形式に変換する

  • func To(_case int, r rune) rune

_caseUpperCase値: LowerCase、、TitleCase

3.4.6文字が中国語かどうかを判断する

func main() {
    for _, r := range "Hello 世界!" {
        // 判断字符是否为汉字
        if unicode.Is(unicode.Scripts["Han"], r) {
            fmt.Printf("%c", r) // 世界
        }
    }
}

その他の unicode.Scripts値については、次を参照してください:http : //www.cnblogs.com/golove/p/3269099.html

3.4.7キャラクターの判断

  • func IsDigit(r rune) bool

    IsDigit決定するrかどうかを小数点以下の数字

  • func IsNumber(r rune) bool

    IsNumber決定しrた数字かどうか(カテゴリN

  • func IsLetter(r rune) bool

    IsLetter決定するr英字(カテゴリかどうかL)、漢字の文字は文字です

  • func IsSpace(r rune) bool

    IsSpace決定しr、空白文字を含むかどうか\t\n\v\f\r

  • func IsControl(r rune) bool

    IsControl決定するr制御文字かどうか

  • func IsGraphic(r rune) bool

    IsGraphic裁判官の文字r、それが含む「図形文字」であるかどうか、文字記号数字句読点記号スペース

  • func IsPrint(r rune) bool

    IsPrint文字rがGoによって定義された「印刷可能な文字」であるかどうかを判別します。これには、文字マーク数字句読点記号ASCIIスペースが含まれます。

  • func IsPunct(r rune) bool

    IsPunct決定するrかどうか句読点文字

  • func IsSymbol(r rune) bool

    IsSymbol決定するrかどうかを記号文字

おすすめ

転載: www.cnblogs.com/ice-coder/p/12725943.html