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
通过修改单个字符元素,将hello world 修改为Hello World
//通过修改单个字符元素,将hello world 修改为Hello World
package main
import (
"fmt"
)
func main() {
var str1 string = "hello world"
//将字符串类型转换为字节数组,并赋值给tmp
tmp := []byte(str1)
//tmp值是一个由对应字符组成的ASCll码 数组。
//将数组第一个值修改为 "H" 对应的ASCll码
tmp[0] = 72
fmt.Println("第一次修改后的数据是:", string(tmp))
//遍历字节数组
for i := 0; i < len(tmp); i++ {
//使用string 将字节转为字符。当转变后的字符为小写w时,将其重新赋值为大写W
if string(tmp[i]) == "w" {
//注意,这里使用单引号,表示 rune类型
tmp[i] = 'W'
}
}
fmt.Println("第二次修改后的数据是:", string(tmp))
//输出结果:
修改后的数据是: Hello world
修改后的数据是: Hello World
fmt.Sprintf(格式化字符串类型,字符串)
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(字符串,关键字)
strings.HasSuffix(字符串,关键字)
判断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, "/")
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(原始字符串,原字段,新字段,替换次数)
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次)
package main
import (
"fmt"
"strings"
)
//复制
func main() {
var str string = "abc"
//复制关键字段3次,相连后,并返回完整字符串
result := strings.Repeat(str, 3)
fmt.Println(result)
}
//输出结果:
abcabcabc
大小写
strings.ToUpper(字符串)
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.Itoatrconv.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 | 格式化字符串,在字符串的两端加上双引号 |