Golang——string

本文探讨了Golang中string的结构,强调其不可变性,并介绍了如何进行string与[]byte及int之间的转换。讨论了在string上进行部分反转的挑战,以及在处理中文字符时的注意事项。此外,还提到了在LeetCode问题中遇到的关于字符串操作的陷阱,如strconv.Itoa和sort.Slice的使用。最后,列举了一些常用的Golang string函数及其应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.string结构体底层
由两部分组成:指向底层[ ]byte数组的指针;长度。(类似切片结构体)

2.相同的string常量不会重复存储

//由s1、s2的指针指向一块相同的只读内存,这段内存以utf-8编码存放hello数组
s1 := "hello"
s2 := "hello"

3.string常量会在编译期分配到只读段,对应数据地址不可写入,故string不支持修改。
要修改必须转[]byte,string和[]byte转换,会将这段只读内存的数据复制到堆/栈上。

//wrong
s := "hello"
s[0] = 'A'
//right
s := "hello"
a := []byte(s)
a[0] = 'H'
s = string(a)    //s="Hello"
package main

import "fmt"

/go的本质是值拷贝,但string底层是指针
/故 函数参数变量s也是一段新地址,但是底层指针指向的地址与main中s相同,为存储数据的空间
func change(s string) string {
   
	fmt.Printf("%#v\n", &s)
	a := []byte(s)
	a[0] = 's'
	return string(a)
}

func main() {
   
	s := "abcd"
	fmt.Printf("%#v\n", &s)
	s2 := change(s)
	fmt.Printf("%#v\n", &s2)
}

在这里插入图片描述

整体反转可以整体转为[]byte,不能把string类型作为参数直接传进来
Q:那怎么在原字符串上进行 部分反转?
输入: “abcd”
输出:“acbd”

部分反转错误解法,change返回的是“cb”,而不是“acbd”
func main()  {
   
	s := "abcd"
	s = change(s[1:3])
	fmt.Println(s)
}
func change(s string) string {
   
	a := []byte(s)
	i := 0
	j := len(a)-1
	for i < j {
   
	   a[i],a[j] = a[j],a[i]
	}
	return string(a)
}
反转正确解法
1.
func main()  {
   
	s := "abcd"
	a := []byte(s)
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值