1. 程式人生 > 其它 >Go 語言字串常見操作

Go 語言字串常見操作

@

目錄

1. 位元組陣列

位元組與字元的區別

  • 位元組(Byte) 是計量單位,表示資料量多少,是計算機資訊科技用於計量儲存容量的一種計量單位,通常情況下一位元組等於八位

  • 字元(Character) 是計算機中使用的字母、數字、字和符號,比如'A'、'B'、'$'、'&'等

  • 一般在英文狀態下一個字母或字元佔用一個位元組,一個漢字用兩個位元組表示

  • 通俗點來說,人的語言就是字元,而位元組是機器的語言

示例

 package main

import "fmt"

func main() {
	var (
		str1 = "hello"
		str2 = "world"
	)
	str3 := str1 + " " + str2

	//字串轉換成位元組陣列
	tmp := []byte(str3)
	fmt.Printf("資料: %s,長度: %d,資料型別: %T\n", str3, len(str3), str3)
	fmt.Println("位元組陣列:", tmp)
	fmt.Printf("資料: %s,長度: %d,資料型別: %T\n", tmp, len(tmp), tmp)

	//位元組陣列轉字串
	fmt.Println("位元組陣列轉字串:", string(tmp))

	//反轉函式呼叫
	fmt.Println("反轉: ", Reverse(str3))
}

//反轉函式
func Reverse(str string) string {
	var (
		result string
		leng   int = len(str)
	)
	for i := 0; i < leng; i++ {
		//sprintf轉換資料型別為string,使用+進行拼接
		result = result + fmt.Sprintf("%c", str[leng-i-1])
	}
	return result
}


//輸出結果如下

資料: hello world,長度: 11,資料型別: string
位元組陣列: [104 101 108 108 111 32 119 111 114 108 100]
資料: hello world,長度: 11,資料型別: []uint8
位元組陣列轉字串: hello world
反轉:  dlrow olleh

Sprintf的作用

package main

import "fmt"

func main() {
	var a = 88
	fmt.Printf("a的數值: %d , 型別: %T\n", a, a)
	b := fmt.Sprintf("%d", a)
	fmt.Printf("b的數值: %s , 型別: %T\n", b, b)
}

//輸出結果如下
a的數值: 88 , 型別: int
b的數值: 88 , 型別: string

2. 頭尾處理

prefix()函式判斷字首
suffix()函式判斷後綴

使用prefix函式判斷URL是否是以http://為開頭,如果不是,則加上http://


使用suffix函式判斷路徑是否以/結尾,如果不是,則加上/為結尾

package main

import (
	"fmt"
	"strings"
)

func main() {
	var (
		url  string
		path string
	)

	fmt.Println("請輸入URL和路徑:")
	fmt.Scanf("%s%s", &url, &path)
	fmt.Printf("URL: %s\n", urlProcess(url))
	fmt.Printf("路徑: %s", pathProcess(path))

}

//字串頭部處理
func urlProcess(url string) string {
	//判斷是否以http://開頭,返回布林型別賦予result
	result := strings.HasPrefix(url, "http://")
	if !result {
		url = fmt.Sprintf("http://%s", url)
	}
	return url
}

//字串尾部處理
func pathProcess(path string) string {
	//判斷是否以/結尾,返回布林型別賦予result
	result := strings.HasSuffix(path, "/")
	if !result {
		path = fmt.Sprintf("%s/", path)
	}
	return path
}

終端輸入如下:

PS D:\goproject\src\test\main> go run .\main.go
請輸入URL和路徑:
www.google.com /opt/conf/k8s
URL: http://www.google.com
路徑: /opt/conf/k8s/

3. 位置索引

Index()函式 判斷出現在前面的位置
LastIndex()函式判斷出現在末尾的位置

判斷子字串在字串中首次出現的位置和在末尾出現的位置

package main

import (
	"fmt"
	"strings"
)

func main() {
	var (
		a   = "abbaabcddccd"
		str = "cd"
	)

	//判斷str在a中首次出現的位置
	head := strings.Index(a, str)
	tail := strings.LastIndex(a, str)
	fmt.Printf("首次出現的位置:%d\n最後出現的位置:%d\n", head, tail)
}


//輸出結果如下
首次出現的位置:6
最後出現的位置:10

4. 替換

Replace()函式
格式如下:
Replace(原字串,原欄位,新字串,新欄位,替換次數)
-1表示全部替換,0表示不替換

package main

import (
	"fmt"
	"strings"
)

func main() {
	var (
		a = "abbaabcddccd"
	)
	//把cd替換成CD,-1表示全部替換,0表示不替換
	result := strings.Replace(a, "cd", "CD", -1)
	fmt.Printf("替換前: %v\n", a)
	fmt.Printf("全部替換後: %v\n", result)
	result1 := strings.Replace(a, "cd", "CD", 0)
	fmt.Printf("不進行替換: %v\n", result1)
}


//輸出結果如下
替換前: abbaabcddccd
全部替換後: abbaabCDdcCD
不進行替換: abbaabcddccd

5. 統計次數

Count()函式 統計次數

package main

import (
	"fmt"
	"strings"
)

func main() {
	var a = "abbcddcedsca"

	count := strings.Count(a, "cd")
	fmt.Printf("count: %v\n", count)
}


//輸出結果如下
count: 1

6. 重複

Repeat()函式 重複輸出多次

package main

import (
	"fmt"
	"strings"
)

func main() {
	var a = "加油~"

	result := strings.Repeat(a, 3)
	fmt.Printf("result: %v\n", result)
}

//輸出結果如下
result: 加油~加油~加油~

7. 大小寫

ToUpper()函式 轉換大寫
ToLower()函式轉換小寫

package main

import (
	"fmt"
	"strings"
)

func main() {
	var a = "hello"
	//轉換大寫
	result1 := strings.ToUpper(a)
	fmt.Printf("大寫: %v\n", result1)

	//把上面轉換的大寫給轉成小寫
	result2 := strings.ToLower(result1)
	fmt.Printf("小寫: %v\n", result2)

}


//輸出結果如下
大寫: HELLO
小寫: hello

8. 去除字元

TrimSpace()函式去除空白字元
TrimLeft()從左往右刪除
TrimRight()從右往左刪除

  • 去除首尾空白字元
package main

import (
	"fmt"
	"strings"
)

func main() {
	var a = " abc "

	fmt.Println("長度:", len(a))
	//去除首位空白的字元
	result1 := strings.TrimSpace(a)
	fmt.Println("去除首尾空白字元:", result1, "\n長度:", len(result1))
}

//輸出結果如下
長度: 5
去除首尾空白字元: abc 
長度: 3
  • 去除指定位置字元
package main

import (
	"fmt"
	"strings"
)

func main() {
	var a = "this is test web"

	//去掉字串首尾部web字元
	result1 := strings.Trim(a, "web")
	fmt.Println("尾部去除:", result1)

	//從左往右刪除所有指定的字元,直到遇到不包含在指定的字元為止
	result2 := strings.TrimLeft(a, "this")
	//空格也需匹配刪除,直到沒有指定的字元可以匹配為止
	result3 := strings.TrimLeft(a, "this ")
	//從右往左刪除所有指定的字元,直到遇到不包含在內的字元為止
	result4 := strings.TrimRight(a, "web")

	fmt.Println("從左往右刪除:", result2)
	fmt.Println("從左往右刪除,有空格:", result3)
	fmt.Println("從右往左刪除:", result4)
}

//輸出結果如下
尾部去除: this is test 
從左往右刪除:  is test web
從左往右刪除,有空格: est web
從右往左刪除: this is test 

9. 字串切片處理

Fields()函式
Split()函式

  • 預設識別空格進行切片處理
package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "abc def ghi"
	//Fields函式預設識別的符號是空格
	result1 := strings.Fields(str)
	fmt.Printf("資料型別: %T , 資料格式: %v\n", result1, result1)
	for i := 0; i < len(result1); i++ {
		fmt.Println(result1[i])
	}
}

//輸出結果如下
資料型別: []string , 資料格式: [abc def ghi]
abc
def
ghi
  • 識別其他符號分隔成切片
package main

import (
	"fmt"
	"strings"
)

func main() {
	var str string = "abc,def,ghi"
	//識別逗號進行分隔切片
	result := strings.Split(str, ",")
	fmt.Printf("資料型別: %T , 資料格式: %v\n", result, result)
}

//輸出結果如下
資料型別: []string , 資料格式: [abc def ghi]

推薦使用Split()函式進行分隔
因為fields()函式預設只能識別空格,不能識別其他符號,而Split()函式則均可以識別


  • 把切片按指定分隔符進行轉換成字串

Join()函式

package main

import (
	"fmt"
	"strings"
)

func main() {
	//定義切片
	var slice = []string{"123", "456", "789"}
	fmt.Printf("切片: %v\n", slice)

	//切片轉換成字串
	result := strings.Join(slice, ":")
	fmt.Printf("資料結構: %v , 資料型別: %T", result, result)
}


//輸出結果如下
切片: [123 456 789]
資料結構: 123:456:789 , 資料型別: string

10. 數值處理

  • 使用strconv.Itoa()函式將數值轉換成字串
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var num int = 12345678
	fmt.Printf("初始資料型別: %T\n", num)
	fmt.Printf("初始值: %d\n", num)

	//轉換成字串
	result := strconv.Itoa(num)
	fmt.Printf("轉換後資料型別: %T\n", result)
	fmt.Printf("轉換後值為: %s", result)
}


//輸出結果如下
初始資料型別: int
初始值: 12345678
轉換後資料型別: string
轉換後值為: 12345678
  • 使用Sprintf()函式將整數轉換成字串
package main

import (
	"fmt"
)

func main() {
	var num int = 12345678
	fmt.Printf("初始資料型別: %T\n", num)

	//使用Sprintf()轉換成字串,可以實現多型別的轉換
	result := fmt.Sprintf("%d", num)
	fmt.Printf("轉換後資料型別:%T\n", result)
}


//輸出結果如下
初始資料型別: int
轉換後資料型別:string
  • 使用strconv.Atoi()函式進行字串轉換整數
package main

import (
	"fmt"
	"strconv"
)

func main() {
	var str string = "12345678"

	//字串轉整數
	result, err := strconv.Atoi(str)
	//如果有轉換過程中有錯,就丟擲錯誤,沒有錯就返回資料型別
	if err == nil {
		fmt.Printf("資料型別: %T\n", result)
	} else {
		fmt.Println(err)
	}
}

//輸出結果
資料型別: int