• Realm
    2018-11-05
    1 string拼接的结果是生成新的string,需要把原字符串拷贝到新的string中;Builder底层有个[]byte,按需扩容,不必每次拼接都需要拷贝;

    2 Reader的优势是维护一个已读计数器,知道下一次读的位置,读得更快.

    作者回复: 嗯,是的。

    
     15
  • 虢國技醬
    2019-12-09
    二刷了一遍,又看了一遍源码;我觉得对于Builder和Reader理解应该注意:
    1,结构:
        1.1 Builder结构体内部内容容器是一个切片buf还有一个addr(复制检测用的指针)
        1.2 Reader结构体内部内容容器是一个string的s和一个内部计数器i
    2. Builder
        2.1 想法方法内部先调用copyCheck方法进行值复制的检测(即老师说的使用后在复制引发panic就是这个方法)
        2.2 内容容器是切片,相关拼接方法内部应用的是append函数,这些方法使用时间可以结合slice和append的原理
        2.3 公开方法Grow进行是否扩容判断逻辑,然后调用内部方法grow执行切片扩容,扩容策略:原内容容器切片容量 * 2 + Grow参数n;用这个容量make申请新的内存空间,然后copy原内容容器切片底层数组值

    3. Reader
       3.1 读取方法底层是对内容容器s字符串的切片操作,这里要注意在多字节字符读取时,字符串的切片操作可能会导致拿到的字符串有乱码的风险,
       3.2 对于Read、ReadAt这些将字符串读取到传入的切片参数时,底层应用的是copy函数,so最终读出的字符串字节切片长度是copy函数两个参数中较小的一个参数的长度。同时Read、ReadAt这些方法的off参数不恰当时,会因为多字节字符串切片导致两头可能出现乱码
    展开
    
     3
  • jimmy
    2019-01-17
    strings.Builder里边的String方法是
    // String returns the accumulated string.
    func (b *Builder) String() string {
        return *(*string)(unsafe.Pointer(&b.buf))
    }
    这样实现的, 请问老师为什么不是
    // String returns the accumulated string.
    func (b *Builder) String() string {
        return string(b.buf)
    }
    有什么特殊的点吗? 谢谢
    展开

    作者回复: 省去了类型转换的开销,效率会高很多。

    
     2
  • kingkang
    2019-01-04
    请问byte数组转string出现乱码怎么处理?

    作者回复: 如果字节数组的内容不是UTF-8编码的Unicode字符,这样直接转就会出现乱码。先要搞清楚两个问题:1. 这个字节数组的内容会是可打印的字符吗?2. 如果是可打印的字符,那它使用什么编码的?

    
     1
  • 南方有嘉木
    2018-11-27
    请问容量增加n个字节,为什么是原来的2倍再加上n呢
    
     1
  • Cloud
    2018-11-05
    很实用!
    
     1
  • 博博
    2019-05-22
    Builder类型中的addr *Builder 字段的意义是什么呢?

    作者回复: 这个 addr 字段的意义是,保存其所属值所在的内存地址。如此一来,一旦这个值被拷贝了,使用内存地址比较的方式就可以检测出来。

     1
    
  • Garry
    2019-04-02
    老师,我在看strings 源码的时候发现了
    func noescape(p unsafe.Pointer) unsafe.Pointer {
        x := uintptr(p)
        return unsafe.Pointer(x ^ 0)
    }
    这个函数 最后用了个x ^ 0,但是这么操作的最后结果不还是x么,为何还要这样操作呢
    展开

    作者回复: 为了产生一个新值啊,要跟这个函数的参数值划清界限。

    
    
  • Geek_1ed70f
    2019-03-14
    读源代码讲得好深....
    
    
  • 虢國技醬
    2019-03-04
    打卡
    
    
我们在线,来聊聊吧