go语言字符串下标 go 字符串数组

golang中数组和slice作为参数的区别最主要的区别是:slice支持负数的下标(代表从字符串结尾开始算位置),substring不支持
substring() 方法用于提取字符串中介于两个指定下标之间的字符 。主要用于字符串截取
stringObject.substring(start,stop)
start:必需 。一个非负的整数 , 规定要提取的子串的第一个字符在 stringObject 中的位置 。
end:可选 。一个非负的整数,比要提取的子串的最后一个字符在 stringObject 中的位置多 1 。
如果省略该参数,那么返回的子串会一直到字符串的结尾 。
例如:"abcdefg".substring(3,5)返回de,字符串的第3个字符是d(从0开始,即a是第0个字符),截取到第5个字符前(不包括第5个)
与 slice()方法不同的是,substring() 不接受负的参数 。
slice() 方法可提取字符串的某个部分 , 并以新的字符串返回被提取的部分 。
stringObject.slice(start,end)
start:要抽取的片断的起始下标 。如果是负数,则该参数规定的是从字符串的尾部开始算起的位置 。也就是说,-1 指字符串的最后一个字符,-2 指倒数第二个字符 , 以此类推 。
end:紧接着要抽取的片段的结尾的下标 。若未指定此参数 , 则要提取的子串包括 start 到原字符串结尾的字符串 。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置 。
slice() 比 substring() 要灵活一些,因为它允许使用负数作为参数 。
golang获取到string和直接赋值strimg不一样1、 string的定义
Golang中的string的定义在reflect包下的value.go中,定义如下:
StringHeader 是字符串的运行时表示,其中包含了两个字段,分别是指向数据数组的指针和数组的长度 。
// StringHeader is the runtime representation of a string.
// It cannot be used safely or portably and its representation may
// change in a later release.
// Moreover, the Data field is not sufficient to guarantee the data
// it references will not be garbage collected, so programs must keep
// a separate, correctly typed pointer to the underlying data.
type StringHeader struct {
Data uintptr
Lenint
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
2、string不可变
Golang中的字符串是不可变的,不能通过索引下标的方式修改字符串中的数据:
在这里插入图片描述
运行代码,可以看到编译器报错,string是不可变的
在这里插入图片描述
但是能不能进行一些骚操作来改变元素的值呢?
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
a := "hello,world"
b := a[6:]
bptr := (*reflect.StringHeader) (unsafe.Pointer(b))
fmt.Println(a)
fmt.Println(b)
*(*byte)(unsafe.Pointer(bptr.Data)) = '.'
fmt.Println(a)
fmt.Println(b)
}
// 运行结果
hello,world
world
unexpected fault address 0x49d7e3
fatal error: fault
[signal 0xc0000005 code=0x1 addr=0x49d7e3 pc=0x4779fa]
goroutine 1 [running]:
runtime.throw(0x49c948, 0x5)
C:/Program Files/Go/src/runtime/panic.go:1117 +0x79 fp=0xc0000dbe90 sp=0xc0000dbe60 pc=0x405fd9
runtime.sigpanic()
C:/Program Files/Go/src/runtime/signal_windows.go:245 +0x2d6 fp=0xc0000dbee8 sp=0xc0000dbe90 pc=0x4189f6
main.main()
F:/go_workspace/src/code/string_test/main.go:20 +0x13a fp=0xc0000dbf88 sp=0xc0000dbee8 pc=0x4779fa
runtime.main()
C:/Program Files/Go/src/runtime/proc.go:225 +0x256 fp=0xc0000dbfe0 sp=0xc0000dbf88 pc=0x4087f6

推荐阅读