码迷,mamicode.com
首页 > 其他好文 > 详细

golang中string以及slice之间的一些问题

时间:2014-11-23 18:48:08      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   color   使用   sp   数据   on   div   

好记性不如烂笔头o_O

 

 slice切片不会开辟新的空间 

a := []int{0,1,2,3}
b := make([]int, 8)
b = a[:]
b[2] = 9
fmt.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 main
import "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之间的一些问题

标签:style   blog   ar   color   使用   sp   数据   on   div   

原文地址:http://www.cnblogs.com/fishincat/p/4117125.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!