Go操作中文字符串

本文介绍了在Go语言中如何处理Unicode字符的中文字符串。通过将字符串转化为[]rune,可以方便地进行长度计算和截取操作。示例代码展示了Len和Cut两个函数的实现,用于获取中文字符串长度和进行字符串截取。

因为Go中字符串是以[]byte形式存储的,而Unicode字符中一个地方对应多个字节,所以不能直接进行便利,需要先将其转化为[]rune再进行操作

package chinese

var Chinese = new(chinese)

type chinese struct{}

// Len
/**
 *  @Description: 获取中文字符串长度
 *  @receiver c
 *  @param str
 *  @return int
 */
func (c chinese) Len(str string) int {
	rt := []rune(str)
	return len(rt)
}


// Cut
/**
 *  @Description: 截取中文字符串
 *  @receiver c
 *  @param str
 *  @param start
 *  @param end
 *  @return string
 */
func (c chinese) Cut(str string, start int, end int) string {
	rt := []rune(str)
	return string(rt[start:end])
}

<think>在Go语言中,字符串赋值操作可以通过多种方式实现。以下是一些常见的赋值方法: 1. **直接赋值**:使用双引号或反引号定义字符串并赋值给变量。 2. **使用`:=`短变量声明**:在函数内部,可以使用短变量声明方式声明并赋值。 3. **使用`var`关键字声明后赋值**:先声明一个字符串变量,再赋值。 4. **通过字符串拼接赋值**:将多个字符串拼接后赋值。 5. **通过类型转换赋值**:将其他类型(如字节切片、符文切片)转换为字符串。 6. **通过函数返回值赋值**:调用返回字符串的函数并赋值。 下面通过代码示例详细说明: ```go package main import "fmt" func main() { // 方法1: 直接赋值 var str1 string = "Hello, World!" // 使用双引号 fmt.Println(str1) // 方法2: 短变量声明 str2 := "你好,世界" // 编译器自动推断类型 fmt.Println(str2) // 方法3: 先声明后赋值 var str3 string str3 = "This is a string" fmt.Println(str3) // 方法4: 字符串拼接赋值 s1 := "Hello" s2 := "Go" str4 := s1 + ", " + s2 + "!" // 使用+运算符 fmt.Println(str4) // 方法5: 类型转换赋值 byteSlice := []byte{65, 66, 67} // ASCII: A, B, C str5 := string(byteSlice) // 将字节切片转换为字符串 fmt.Println(str5) // 输出: ABC runeSlice := []rune{0x4E2D, 0x6587} // Unicode: 中, 文 str6 := string(runeSlice) // 将符文切片转换为字符串 fmt.Println(str6) // 输出: 中文 // 方法6: 函数返回值赋值 str7 := getString() fmt.Println(str7) } func getString() string { return "String from function" } ``` **注意**: - Go语言中的字符串是不可变的,一旦创建,字符串内容不能被修改。但可以重新赋值给变量(即变量指向新的字符串)。 - 使用反引号(`)可以定义多行字符串(Raw String Literals),且不会转义特殊字符。 - 使用双引号时,字符串内可以包含转义字符(如`\n`换行、`\t`制表符等)。 例如,使用反引号定义多行字符串: ```go multiLineStr := `第一行 第二行 第三行 \n\t 不会被转义` fmt.Println(multiLineStr) ``` **性能提示**: - 在循环中拼接大量字符串时,使用`+`运算符会频繁创建新字符串,导致性能下降。建议使用`strings.Builder`或`bytes.Buffer`进行高效拼接。 示例: ```go import ( "strings" "fmt" ) func main() { var builder strings.Builder words := []string{"Go", "is", "awesome!"} for _, word := range words { builder.WriteString(word) builder.WriteString(" ") } result := builder.String() // 获取拼接后的字符串 fmt.Println(result) // 输出: Go is awesome! } ``` 通过以上方法,可以灵活地进行字符串赋值操作。 §§相关问题§§ 1. Go语言中字符串为什么是不可变的?有什么优缺点? 2. 如何高效地拼接大量字符串? 3. Go语言中如何修改字符串中的某个字符? 4. 字节切片([]byte)和符文切片([]rune)在字符串处理中有何区别? 5. 如何正确处理包含多字节字符(如中文)的字符串操作?</think>### Go语言字符串赋值操作详解 在Go语言中,字符串赋值操作主要有以下几种方法: #### 1. **直接赋值** 使用双引号或反引号直接赋值: ```go var s1 string = "Hello, Go!" // 双引号赋值 s2 := `多行字符串 第二行` // 反引号赋值(支持换行) ``` #### 2. **类型转换赋值** 将字节切片或符文切片转换为字符串: ```go // 字节切片转字符串 byteSlice := []byte{72, 101, 108, 108, 111} s3 := string(byteSlice) // "Hello" // 符文切片转字符串(处理多字节字符) runeSlice := []rune{'世', '界'} s4 := string(runeSlice) // "世界" ``` #### 3. **拼接赋值** 使用`+`或`fmt.Sprintf`拼接字符串: ```go s5 := "Hello" + ", " + "World!" // 直接拼接 s6 := fmt.Sprintf("%s %d", "Year", 2023) // 格式化拼接 ``` #### 4. **切片赋值** 通过切片操作获取子字符串: ```go s7 := "Hello, 世界" sub1 := s7[0:5] // "Hello"(按字节切片) sub2 := string([]rune(s7)[7:9]) // "世界"(先转符文切片) ``` #### 5. **修改字符(需先转符文切片)** 字符串不可直接修改,需转换为`[]rune`: ```go str := "Hello, 世界" runeStr := []rune(str) runeStr[7] = 'G' // 修改第8个字符(索引从0开始) s8 := string(runeStr) // "Hello, G界" ``` #### 6. **函数返回值赋值** ```go func generate() string { return "Function Generated" } s9 := generate() ``` --- ### 关键注意事项 1. **不可变性** Go字符串不可修改,任何"修改"操作实际是创建新字符串: ```go s := "A" s += "B" // 实际创建新字符串"AB" ``` 2. **多字节字符处理** 中文字符需用`[]rune`处理,避免字节截断问题: ```go s := "你好" fmt.Println(len(s)) // 6(字节长度) fmt.Println(len([]rune(s))) // 2(字符数量) ``` 3. **内存效率** 大量拼接时使用`strings.Builder`更高效: ```go var builder strings.Builder builder.WriteString("A") builder.WriteString("B") result := builder.String() // "AB" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值