golang基础小记(3)——字符类型(byte和rune)与字符串修改

byte和rune类型

两种字符类型:

  1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
  2. rune类型,代表一个UTF-8字符,本质是int32类型。
    rune类型用于处理复合字符,如中文、日文等。

代码示例:

package main

import "fmt"

func main() {
	s := "wo ai 中国"
	// len(s) 返回的是s的字节数,而不是字符数
	fmt.Println(len(s)) // 12
	// 用 len(s) 逐个打印,实际是按字节输出,复合字符(占3~4个字节,如中文)会出现乱码
	for i := 0; i < len(s); i++ { //byte
		fmt.Printf("%v(%c) ", s[i], s[i])
	}
	fmt.Println()
	fmt.Printf("%T\n", s[0]) // uint8
	// 隐式声明时,字符默认是 rune 类型,即 int32 类型
	c := '1'
	fmt.Printf("%T\n", c) // int32
	// 用 range 循环可以正确输出字符
	for _, r := range s { //rune
		fmt.Printf("%v(%c) ", r, r)
	}
}

输出:

12
119(w) 111(o) 32( ) 97(a) 105(i) 32( ) 228(ä) 184(¸) 173(­) 229(å) 155(›) 189(½) 
uint8
int32
119(w) 111(o) 32( ) 97(a) 105(i) 32( ) 20013(中) 22269(国) 

字符串修改

字符串底层是一个 byte 数组,所以可以和 []byte 或 []rune 类型相互转换;字符串是不能修改的,需要先进行转换,修改后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组。
代码示例:

	s2 := "ai中国"
	// 强制类型转换
	// 转换为 []byte 类型 
	byteS2 := []byte(s2)
	// 转换为 []rune 类型
	runeS2 := []rune(s2)
	byteS2[1] = 'h'
	runeS2[3] = '华'
	// 强制转换回 string 类型,并输出
	fmt.Println(string(byteS2)) // ah中国
	fmt.Println(string(runeS2)) // ai中华

参考:https://www.liwenzhou.com/posts/Go/02_datatype/

猜你喜欢

转载自blog.csdn.net/m0_37710023/article/details/106525967