- 1.文字列の概要
- 2.文字列の連結
- 3.文字列の一般的な処理
- 3.1文字列パッケージ
- 3.1.1 2つのUTF-8エンコードされた文字列が同じかどうかを判断する
- 3.1.2文字列strがプレフィックスで始まるかどうかを判断する
- 3.1.3文字列strがサフィックスで終了しているかどうかを判断する
- 3.1.4 sがstrで最初に出現する位置を決定し、出現しない場合は-1を返す
- 3.1.5 str内で最後に出現するsの位置を特定し、出現しない場合は-1を返す
- 3.1.6親文字列内の非ASCIIエンコード文字の位置を照会する
- 3.1.7文字列の置換
- 3.1.8 str内のsubstrの出現回数を返す
- 3.1.9繰り返しカウントstr
- 3.1.10大文字と小文字の変換
- 3.1.11終了スペース文字を削除する
- 3.1.12 strの両側のカット文字列を削除します
- 3.1.13 strの側面にあるカット文字列を削除します
- 3.1.14 strをスライスに区切るための区切り文字としてスペースを使用する
- 3.1.15区切り文字として分割、strをスライスに分割
- 3.1.16 sepを使用してスライス内のすべての要素を文字列に結合する
- 3.1.17文字列sに部分文字列substrが含まれているかどうかを判別する
- 3.1.18文字列sにutf-8コード値rが含まれているかどうかを判別する
- 3.1.19文字列sに文字列charsの文字が含まれているかどうかを判別する
- 3.2 bytes 包
- 3.3 strconvパッケージ
- 3.4 unicode 包
- 3.1文字列パッケージ
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
タイプは値タイプであり、格納されている文字列は不変です。コンテンツを変更する場合はstring
string
[]byte
[]rune
string
、またはに変換する必要があり、変更されたコンテンツは再配布されます。
関数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
あなたは新しい拡張と作成を避けることができますslice
。strings.Builder
非スレッドセーフ、およびパフォーマンスはbytes.Buffer
ほぼ同じです。
3.文字列の一般的な処理
:4つの標準ライブラリのパッケージには、文字列操作のために特に重要であるがありbytes
、strings
、strconv
そしてunicode
パッケージが。
strings
パッケージは、多くの提供するクエリ文字列、置換、比較、カット、スプリットおよびマージ機能をbytes
パッケージには、多くの機能に類似の機能を提供しますが、文字列のと同じ構造の持つ[]byte
タイプを。文字列は読み取り専用であるため、文字列を徐々に作成すると、多くの割り当てとコピーが発生します。この場合、bytes.Buffer
typeを使用するとより効果的ですstrconv
このパッケージは、ブール、整数、浮動小数点、および対応する文字列間の変換を提供し、二重引用符のエスケープに関連する変換も提供しますunicode
パッケージの提供はIsDigit
、IsLetter
、IsUpper
およびIsLower
および他の同様の機能、彼らは分類文字に使用されています
3.1文字列パッケージ
3.1.1 2つのUTF-8エンコードされた文字列が同じかどうかを判断する
func EqualFold(s, t string) bool
unicode
3つの形式のタイトル文字と同じとみなさ大文字、小文字、
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
文字列の文字列を返す置換の結果、交換頻度のパラメータ無限のために。
str
old
newStr
n
n<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”
8
10
bitSize
結果はなしタイプの割り当て整数指定する必要があり0
、オーバーフロー8
、16
、32
、、64
表しますint
、int8
、int16
、int32
、int64
。
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の場合1
t
T
TRUE
true
True
str
0
f
F
FALSE
false
False
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)
bitSize
:32
または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のタイプを示す32
(float32
:64
、float64
:)、それに応じて丸めます。
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
_case
UpperCase
値: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
かどうかを記号文字