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

好记性不如烂笔头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个字节。

 

转载于:https://www.cnblogs.com/fishincat/p/4117125.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值