首页 > 代码库 > golang中string以及slice之间的一些问题
golang中string以及slice之间的一些问题
好记性不如烂笔头o_O
slice切片不会开辟新的空间
a := []int{0,1,2,3}b := make([]int, 8)b = a[:]b[2] = 9fmt.Println(a)fmt.Println(b)输出:[0 1 9 3][0 1 9 3]
string底层是用byte数组存的,并且是不可以改变的。
可以用 k := []rune(string) rune等效int32 k := []byte(string) 提取出数据(存于新开辟的空间)。不能使用 []int 提取。
[]byte 跟 [7]byte不能相互赋值。当函数的参数是 [7]byte的时候,就不能将 k := make([]byte, 7) 当做形参传递进去,会编译报错;只能var k [7]byte。还有一个很重要的现象:
package main
import "fmt"
type T struct { v []byte c int}func main() { var k = make([]byte, 7) t := T{k, 3} t.v[1] = 88 fmt.Println(k) fmt.Println(t)}
输出:
[0 88 0 0 0 0 0]{[0 88 0 0 0 0 0] 3}
package main
import "fmt"
type T struct { v [7]byte c int}func main() { var k [7]byte t := T{k, 3} t.v[1] = 88 fmt.Println(k) fmt.Println(t)}
输出:
[0 0 0 0 0 0 0]{[0 88 0 0 0 0 0] 3}
说明 [7]byte将整个数据给复制过去了,而[]byte只是复制了数组的信息。
下面看看给string赋值
package mainimport "fmt"func main() { //var k [7]byte var k1 = []byte{‘a‘,‘b‘,‘c‘,‘d‘} //s := string(k) s1 := string(k1) fmt.Println(s1)}
输出:abcd
将上述代码注释去掉之后会编译报错。
可以总结出 string 与 []byte之间可以相互强制类型转换。[]rune也可以,不过rune是int32的别名,当里面的一个单元存储的是中文字的时候,转换成string会占用3个字节。
golang中string以及slice之间的一些问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。