1、字符串基本知识
--go 语言中时使用 “” 表示字符串
--定义的实例:
s1 := "hello"
s2 := "你好"
--Go 语言的字符串常见转义符包含回车、换行、单双引号、制表符等,如下表所示。
转义符 含义
\r 回车符(返回行首)
\n 换行符(直接跳到下一行的同列位置)
\t 制表符
\' 单引号
\" 双引号
\\ 反斜杠
--代码示例:
package main
import (
"fmt"
)
func main() {
fmt.Println("str := \"c:\\Code\\lesson1\\go.exe\"")
}
2、多行字符串
--Go语言中要定义一个多行字符串时,就必须使用反引号字符:
s1 := `第一行
第二行
第三行
`
fmt.Println(s1)
3、字符串常用操作
字符串的常用操作
len(str) 求长度
+或fmt.Sprintf 拼接字符串
strings.Split 分割
strings.contains 判断是否包含
strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
strings.Index(),strings.LastIndex() 子串出现的位置
strings.Join(a[]string, sep string) join操作
--代码示例:
# 导入包strings
import (
"fmt"
"strings"
)
# 转义字符
var s1 = "\"D:\\代码\\【瑞客论坛 www.ruike1.com】老男孩带你21周搞定Go语言【全 242】\""
fmt.Print(s1)
# 字符串常用操作
// 两种拼接字符串的方式
var s1 = "liming"
var s2 = "yuel"
var s3 = s1 + s2 // 使用+拼接字符串
var s4 = fmt.Sprintf("%s%s", s1, s2) // 使用 fmt.Sprintf 拼接字符串
fmt.Println(s3)
fmt.Println(s4)
// 字符串长度获取
fmt.Println(len(s4))
// split 切割路径
path := "D:\\代码\\go\\day01"
ret_path := strings.Split(path, "\\")
fmt.Println(strings.Split(path, "\\")) // 这里记住是一个字符串 \\ 所以双引号,和python不同单引号、双引号无所谓
// 字符串中是否包含 某一个字符串
fmt.Println(strings.Contains(path, "代码"))
fmt.Println(strings.Contains(path, "daima"))
// 字符串前缀 后缀
fmt.Println(strings.HasPrefix(path, "D:\\"))
fmt.Println(strings.HasSuffix(path, "day01"))
// 找出字符串中某一个字符串的位置,一个英文占一个位置 一个中文汉字占3个位置
fmt.Println(strings.Index(path, "\\go"))
fmt.Println(strings.LastIndex(path, "\\go"))
fmt.Println(strings.LastIndex(path, "码"))
// 一个字符串列表依据某一个字符拼接而成
fmt.Println(strings.Join(ret_path, "+"))
4、byte 和 rune
--组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:
--var a := '中'
--var b := 'x'
--在go语言中,字符有以下两种:
--uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
--rune类型,代表一个 UTF-8字符。
--当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。
--示例一:
--遍历一个字符串中的字符:含中文,如果是用 byte 就会出现问题,如果使用的是rune则正常
--代码示例如下:
s := "hello沙河"
// byte 遍历
for i := 0; i < len(s); i++ {
fmt.Printf("%T %c ", s[i], s[i])
}
fmt.Println()
// rune 遍历
for a, r := range s { // 这里使用了迭代器
fmt.Printf("%c %T %c ", a, r, r)
}
--因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出错误的字符
--字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。
5、修改字符串
--要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
--但这里统一希望大家改为 []rune
--代码示例:
s := "hello沙河"
// 使用 byte类型进行修改
btye_list_s := []byte(s)
// btye_list_s[0] = '离' // 使用中文会报错
btye_list_s[0] = 'w' // 使用中文会报错
fmt.Println(string(btye_list_s))
// 使用 rune类型进行修改
rune_list_s := []rune(s)
rune_list_s[0] = 'r'
rune_list_s[1] = '离' // 使用中文没事
fmt.Println(string(rune_list_s))
6、强制类型转换
--go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。
--强制类型转换的基本语法如下:
--T(表达式)
--其中,T表示要转换的类型。表达式包括变量、复杂算子和函数返回值等。
--代码示例:
var a, b = 3, 4
var c int
// math.Sqrt()接收的参数是float64类型,需要强制转换
c = int(math.Sqrt(float64(a*a + b*b)))
fmt.Println(c)