go資料型別轉換和字串處理
go資料型別轉換和字串處理
目錄go資料型別轉換和字串處理
資料型別轉換和位元組陣列
資料型別(表示式)
如:
- string(abc) :將abc 轉換為string型別
- []byte(abc): 將abc 轉換為 位元組型別,組成位元組陣列
- float32(1):將 1 轉換為32位浮點型
package main import "fmt" func main() { var ( str1 = "hello" str2 = "world" ) result := str1 + " " + str2 fmt.Printf("資料%s,長度:%d,資料型別:%T\n", result, len(result), result) //字串轉換成位元組陣列 tmp := []byte(result) fmt.Printf("tmp資料%s,長度:%d,資料型別:%T\n", tmp, len(tmp), tmp) for i := 0; i < len(tmp); i++ { //位元組 轉字元 fmt.Println(string(tmp[i])) // a := len(tmp) - 1 - i // fmt.Println(string(tmp[a])) } fmt.Println(string(tmp)) fmt.Println("反轉:", Revers(result)) } //反轉函式 func Revers(str string) string { var ( result string leng int = len(str) ) for i := leng - 1; i >= 0; i-- { //sprintf轉換資料型別為string,使用 + 進行拼接 result = result + fmt.Sprintf("%c", str[i]) } return result } //輸出結果: 資料hello world,長度:11,資料型別:string tmp資料hello world,長度:11,資料型別:[]uint8 h e l l o w o r l d hello world 反轉: dlrow olleh
使用 fmt.Sprintf(格式化字串型別,字串)
將任何資料轉換為string 型別
package main
import "fmt"
func main() {
var num = 10
fmt.Printf("num的型別是:%T \n", num)
ref := fmt.Sprintf("%d", num)
fmt.Printf("num的型別是:%T", ref)
}
//輸出結果:
num的型別是:int
num的型別是:string
注意,go 不支援隱式轉換型別
package main import "fmt" func main() { var a int64 = 10 var b int32 = 20 //此時,有與ab的數值型別不同,直接交換會報錯 a = b fmt.Printf("b為%d", b) }
此時執行則報錯
cannot use a (type int64) as type int32 in assignment
修改後:
package main
import "fmt"
func main() {
var a int64 = 10
var b int32 = 20
//需要將a轉換為int32,再交換
b = int32(a)
fmt.Printf("b為%d", b)
}
//輸出結果:
b為10
頭尾處理
strings.HasPrefix(字串,關鍵字)
判斷字串是否以關鍵字為開頭。 返回值為 bool型別
strings.HasSuffix(字串,關鍵字)
判斷字串是否以關鍵字為結尾。返回值為bool型別
判斷URL是否以 "http://" 開頭。如果不是,則加上"http://"
判斷路徑是否以 "/" 結尾,如果不是,則加上 "/" 為結尾
package main
import (
"fmt"
"strings"
)
func main() {
var (
url string
path string
)
//輸入兩個值
fmt.Scanf("%s%s", &url, &path)
fmt.Println(urlProcess(url))
fmt.Println(pathProcess(path))
}
//頭部判斷是否包含 http:// ,如果不包含,則加上http://
func urlProcess(url string) string {
//返回的resutl 型別是 bool型別
result := strings.HasPrefix(url, "http://")
if !result {
url = fmt.Sprintf("http://%s", url)
}
return url
}
//尾部:判斷是否包含 / ,如果不包含,則加上 /
func pathProcess(path string) string {
//返回的resutl 型別是 bool型別
result := strings.HasSuffix(path, "http://")
if !result {
path = fmt.Sprintf("%s/", path)
}
return path
}
位置索引
判斷字串在字串中首次出現的位置 strings.Index(字串,關鍵字)
末尾出現的位置strings.LastIndex(字串,關鍵字)
package main
import (
"fmt"
"strings"
)
//判斷關鍵欄位在字串中出現的索引位置
func main() {
var (
s string = "abbacddccd"
str string = "cd"
)
start := strings.Index(s, str)
fmt.Println("關鍵詞首部出現的位置:", start)
end := strings.LastIndex(s, str)
fmt.Println("關鍵詞尾部出現的位置:", end)
}
//輸出結果:
關鍵詞首部出現的位置: 4
關鍵詞尾部出現的位置: 8
替換
strings.Replace(原始字串,原欄位,新欄位,替換次數)
替換次數小於0,如-1 ,則表示全文所有匹配都替換
package main
import (
"fmt"
"strings"
)
//替換
func main() {
var (
s string = "abbacddccdabcd"
str string = "cd"
)
//替換Replace(原始字串,原欄位,新欄位,替換次數),-1(小於0的整數)表示全文替換,0表示不替換
//從左向右,替換1次
result1 := strings.Replace(s, str, "CD", 1)
fmt.Println("替換字串:", result1)
//從左向右,替換2次
result2 := strings.Replace(s, str, "CD", 2)
fmt.Println("替換字串:", result2)
//全文替換
result3 := strings.Replace(s, str, "CD", -1)
fmt.Println("替換字串:", result3)
}
//輸出結果:
替換字串: abbaCDdccdabcd
替換字串: abbaCDdcCDabcd
替換字串: abbaCDdcCDabCD
統計次數
strings.Count(字串,關鍵字)
統計關鍵字在字串裡出現的次數
package main
import (
"fmt"
"strings"
)
func main() {
var (
s string = "abbacddccdabcd"
str string = "cd"
)
//使用count 統計關鍵字出現的次數
count := strings.Count(s, str)
fmt.Println("cd出現的次數", count)
}
//輸出結果:
cd出現的次數 3
複製
strings.Repeat(字串,n次)
將字串連續複製n次
package main
import (
"fmt"
"strings"
)
//複製
func main() {
var str string = "abc"
//複製關鍵欄位3次,相連後,並返回完整字串
result := strings.Repeat(str, 3)
fmt.Println(result)
}
//輸出結果:
abcabcabc
大小寫
strings.ToLower(字串)
將字串字母大寫
strings.ToLower(字串)
將字串 字母小寫
package main
import (
"fmt"
"strings"
)
//字串大小寫
func main() {
var str string = "abc"
//字串變大寫
result1 := strings.ToUpper(str)
fmt.Println("大寫:", result1)
//字串變小寫
result2 := strings.ToLower(result1)
fmt.Println("小寫:", result2)
}
//輸出結果:
大寫: ABC
小寫: abc
去除字元
strings.Trimspace(字串)
去除字串首尾空格
strings.Trim(字串,匹配字)
去除字串首尾的匹配字
strings.TrimLeft(字串,關鍵字)
從左往右開始去除關鍵字,直到第一個不匹配關鍵字的為止(空格參與匹配)
strings.TrimRight(字串,關鍵字)
從右往左開始去除有關鍵字,直到第一個不匹配關鍵字的為止(空格參與匹配)
package main
import (
"fmt"
"strings"
)
//去除指定字元
func main() {
var s string = " abc "
var s1 string = "web this is web abc web"
var s2 string = "this is c abc this isc abc\tweb"
fmt.Println("原長度", len(s))
//去除首尾空格
result1 := strings.TrimSpace(s)
fmt.Printf("現長度:%d,內容:%s\n", len(result1), result1)
//去除首尾匹配關鍵字
result2 := strings.Trim(s1, "web")
fmt.Println("Trim處理後的字串:", result2)
//TrimLeft()
//從左匹配關鍵字元,進行刪除,直到沒有匹配上的字元為止。即使後面有匹配字元,也不會被刪除
//注意,空格也是字元
fmt.Println("TrimLeft處理前:", s2)
result3 := strings.TrimLeft(s2, " thisc")
fmt.Println("TrimLeft處理後:", result3)
//TrimRight()
//從右匹配關鍵字元,進行刪除,直到沒有匹配上的字元為止。即使後面有匹配字元,也不會被刪除
//注意空格也是字元.製表符\t和空格不是
result4 := strings.TrimRight(s2, "\tcweb")
fmt.Println("TrimRitht處理結果:", result4)
}
//輸出結果:
原長度 6
現長度:3,內容:abc
Trim處理後的字串: this is web abc
TrimLeft處理前: this is c abc this isc abc web
TrimLeft處理後: abc this isc abc web
TrimRitht處理結果: this is c abc this isc a
切片處理
例項:字串以空格分隔 轉成切片
package main
import (
"fmt"
"strings"
)
//字串切片處理
func main() {
var str string = "abc def ghi"
//Fieds函式識別的符號時空格
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() {
//split識別其他特殊符號分隔
var str string = "abc:def:ghi"
result1 := strings.Split(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() {
//split識別其他特殊符號分隔
var str string = "abc def ghi"
result1 := strings.Split(str, " ")
fmt.Printf("資料型別是%T,資料格式%v\n", result1, result1)
//把切片按照指定分隔符,合併車字串
str2 := strings.Join(result1, ",")
fmt.Printf("資料型別是%T,資料格式%v\n", str2, str2)
}
數值處理
使用strconv.Itoa
數值轉化為字串,使用trconv.Atoi
將字串轉為數值
package main
import (
"fmt"
"strconv"
)
func main() {
var num int = 123456
var str string = "123"
fmt.Printf("num的資料型別是:%T\n", num)
fmt.Printf("str的資料型別是:%T\n", str)
fmt.Println("-------")
//數值轉為字元
result1 := strconv.Itoa(num)
fmt.Printf("result1的資料型別是:%T\n", result1)
fmt.Println("--------")
//字元轉為數值(字元需要是 1234這種數字型別的字串)
//atoi 轉換後,會出現兩個值,一個是轉換後的值,一個是error,用於丟擲錯誤資訊。
//如果轉換成功,error 值為空。
result2, err := strconv.Atoi(str)
if err == nil {
fmt.Printf("result2的資料型別是%T", result2)
} else {
fmt.Println("轉換失敗")
}
}
//
num的資料型別是:int
str的資料型別是:string
-------
result1的資料型別是:string
--------
result2的資料型別是int
使用fmt.Sprintf(格式化字串型別,字串)
將任意型別資料轉換為字串
格式化字串:
- int 型別資料:%d
- string型別資料: %s
- float型別資料:%f
- bool型別資料:%t
- 指標:%p
package main
import "fmt"
func main() {
var (
num1 = 12345
num2 = 3.1415
b1 = true
)
fmt.Printf("num1是%T型別。\nnum2 是%T型別。\nb1 是%T型別\n", num1, num2, b1)
fmt.Println("--------")
result1 := fmt.Sprintf("%d", num1)
result2 := fmt.Sprintf("%f", num2)
result3 := fmt.Sprintf("%t", b1)
fmt.Printf("result1的型別是%T\n result2的型別是%T\n result3的型別是%T", result1, result2, result3)
}
//輸出結果:
num1是int型別。
num2 是float64型別。
b1 是bool型別
--------
result1的型別是string
result2的型別是string
result3的型別是string
字串格式化
格 式 | 描 述 |
---|---|
%v | 按值的本來值輸出 |
%+v | 在 %v 基礎上,對結構體欄位名和值進行展開 |
%#v | 輸出 Go 語言語法格式的值 |
%t | 輸出布林值 |
%T | 輸出 Go 語言語法格式的型別和值 |
%% | 輸出 % 本體 |
%s | 輸出字串(string和[]byte)值 |
%b | 整型以二進位制方式顯示 |
%o | 整型以八進位制方式顯示 |
%d | 整型以十進位制方式顯示 |
%x | 整型以十六進位制方式顯示 |
%X | 整型以十六進位制、字母大寫方式顯示 |
%U | Unicode 字元 |
%f | 浮點數 |
%p | 指標,十六進位制方式顯示 |
%q | 格式化字串,在字串的兩端加上雙引號 |