• 【协作式原创】查漏补缺之Go的slice基础和几个难点


    【转载】队友博客

    Q: 为啥要字节对齐的
    https://www.nowcoder.com/discuss/57978

    TODO:

    Q: go反汇编指令

    go tool compile -S plan9Test.go | grep plan9Test.go:6
    

    Q: a[0]:(int32,0,5)(int32,3,5) 3可以append,0不可以append.

    Q: 如何证明slice底层函数被修改了
    A: 打印slice的第一个元素地址即可,第一个元素地址就是数组地址。
    A: 也可以用反射获取slce的运行时结构SliceHeader,可以看到具体的data,len,cap字段值

    Q: slice和slice的指针的区别. new返回的是指向slice的指针,不能当成slice使用,必须解指针后成为slice后,才方便使用.

    a=*new(int[],0,5) new返回unsafe.Pointer,需要解地址才是切片
    

    Q: TODO 内存对齐,字节对齐: why,how.

    Q: 值传递时,值传递到底传递的是啥,如何传递的副本。a变量是地址的别名,传递变量的内存地址值,内存地址值拷贝一个副本。

    TODO:

    a[1:4] a[8:] 修改还是没修改的原理

    growslice函数有多个分支

    1. 入参 cap的计算
    2. else 分支 newcap += newcap /4
    3. 最开始的分支的坑, 为什么是cap扩容为6而不是8。
  • 相关阅读:
    密码学与安全技术
    分布式系统核心问题
    虚拟机性能监控与故障处理工具
    垃圾收集器与内存分配策略
    Channel
    Buffer
    Reactor
    I/O简介
    HashMap
    装饰者模式
  • 原文地址:https://www.cnblogs.com/yudidi/p/12311361.html
Copyright © 2020-2023  润新知