首页 > 代码库 > 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之间的一些问题