初面网初面网

字符与字符串

字符

字符有两种类型:

  • uint8类型,也叫byte型,代表ASCII码的一个字符
  • rune类型,代表一个UTF-8字符,实际是int32

Golang用rune类型来处理Unicode,让基于Unicode的文本处理更为方便。

可以使用byte型进行默认字符串处理,性能和扩展性都有照顾。

汉字用utf-8编码,占用3字节。如果用GBK编码则占用2字节。

var a = 'a' // 单引号定义字符
var b = "this"

fmt.Printf("值: %v 类型: %T,字符: %c", a,a,a)  // 第一个会输出ascii码值97。%c标明输出字符
fmt.Printf("输出字符:%c,输出asc码:%v", b[2], b[2])

字符串

// 字符串转义。转义符自行百度
str1 := "this \n is str"
fmt.Println(str1)

// 定义多行
str :=`
h
e
l
l
o
`

常用方法

方法介绍
len(str)求长度
+或fmt.Sprintf拼接字符串
strings.Split分割
strings.contains判断是否包含
strings.HasPrefix,strings.HasSuffix前缀/后缀判断
strings.Index(),strings.LastIndex()子串出现的位置
strings.Join(a[]string, sep string)join操作,切片转字符串
str := "hello world,t"   // 如果是汉字,一个字是3字节
name := "ony"

// 长度
fmt.Println(len(str))

//注意,字符串的长度无法使用unsafe.Sizeof(str)查看。如果使用该函数,返回值是字符串的地址长度

// 拼接
fmt.Println(str + name)
// fmt.Sprintf("%v%v", str, name)

// 多行拼接
/*
    str1 :="ffff" +     // 这个拼接用的+号必须写在一行的末尾
            "tttt" +
            "nnnn"
*/

// 分割
res := strings.Split(str, ",")
fmt.Println(res)

// 包含
containStr := strings.Contains(str, "hello")  // 返回布尔值

// 前、后缀判断
hasSubStr := strings.HasPrefix(str, "he")  // 返回布尔值

// 出现位置.无论是从前找还是从后找,返回的位置都是从做向右数的下标值
subStrIndex := strings.Index(str, "el") // 返回位置下标。找不到返回-1

// join切片转字符串
rejoin := strings.Join(res, ",")

// 遍历字符串的字符
cstr := "你好 world"
for _, v := range cstr {
  fmt.Printf("%v(%c)", v,v)
}

修改字符串

修改字符串要先转成[]rune 或 []byte,完成后再转换为string。

系统会在转换过程中重新分配内存,并复制字节数组。

s1 := "big"
byteStr = []byte(s1)
// 如果包含汉字要转成runebyteStr = []rune(s1)
byteStr[0] = 'p'
fmt.Println(string(byteStr))

其他类型转字符串

方法一,使用Sprintf

num1 := 10
num2 := 12.333333
t := false
cchar := 'a'
strInt = fmt.Sprintf("%d", num1)
strFloat = fmt.Sprintf("%f", num2)
strBool = fmt.Sprintf("%t", t)
strChar = fmt.Sprintf("%c", cchar)

fmt.Printf("%d", strInt)
fmt.Printf("%f", strFloat)
fmt.Printf("%t", strBool)
fmt.Printf("%c", strChar)

方法二,使用第三方包strconv

num1 := 10
num2 := 12.333333
t := false
cchar := 'a'

s1 := strconv.FormatInt(num1, 10)   // 参数2是进制
s2 := strconv.FormatFloat(float64(num2), 'f', -1, 64)
s3 := strconv.FormatBool(t)
s4 := strconv.FormatUint(uint64(cchar), 10)

fmt.Printf("值: %v, 类型: %T \n", s1, s1)
fmt.Printf("值: %v, 类型: %T \n", s2, s2)
fmt.Printf("值: %v, 类型: %T \n", s3, s3)
fmt.Printf("值: %v, 类型: %T \n", s4, s4)

字符串转其他类型

str := "13579"

n1, _ := strconv.ParseInt(str, 10, 64)  // 函数会返回两个值,第一个是值,第二个是转换失败时的err

f1, _ := strconv.ParseFloat(str, 64)

b1, _ := strconv.ParseBool("xxxx")  // 出了true和false,其他字符都会转换成false

fmt.Printf("%v--%T", n1, n1)
fmt.Printf("%v--%T", f1, f1)

更新于 2026/8/13