• 一个关于网络通信的问题 at 2019年04月15日

    理解本地环回网卡你就知道经历了那些层,首先环回网卡是协议栈实现的虚拟网卡,它接收和发送数据都是在本机完成,不会经过真实网卡,从上层接收来的数据又写回协议栈。整体流程: http client -> tcp -> ip -> 环回网卡 -> ip -> tcp -> wechat。

  • 想反编译直接得到 go 源码是不太可能,只能看到汇编。

  • 二级指针操作链表,和我写过的文章其实是类似的 https://sheepbao.github.io/post/list_of_pointer_to_pointer/
    但是也没明白为何你的操作会导致这样的结果,我看了 Next 的地址都是一样,应该不是 GC 的问题,你设置 GOGC=off 关闭 gc 试试。

  • (Method_declarations)[https://golang.google.cn/ref/spec#Method_declarations] 那是 go 方法的声明,spec 讲了If the receiver's value is not referenced inside the body of the method, its identifier may be omitted in the declaration. The same applies in general to parameters of functions and methods.
    意思就是,接收器的值并没有在方法內使用的话,可以忽略。这规则一样适用于函数的参数。

  • 怎么计算这个checksum at 2018年08月09日

    chechsum 校验和在网络传输中用的很多,详细的定义看https://tools.ietf.org/html/rfc1071 按照你给的题目的算法描述,和这个 checksum 还是有区别的。

    func checksum(seq uint32, b []byte) uint32 {
        var (
            sum     uint32
            padByte byte
            padLen  int
        )
    
        padByte = byte(0xAB)
        sum = seq
    
        dataLen := len(b)
        remainder := dataLen % 4
    
        if remainder > 0 {
            padLen = 4 - remainder
        }
    
        padding := func() []byte {
            pad := make([]byte, 4)
            lastData := b[dataLen-remainder:]
    
            for i := 4 - padLen; i < 4; i++ {
                pad[i] = padByte
            }
    
            for i := range lastData {
                pad[i] = lastData[i]
            }
    
            return pad
        }
    
        if dataLen < 4 {
            sum += binary.BigEndian.Uint32(padding())
            return sum
        }
    
        for i := 0; i+4 < dataLen; i += 4 {
            sum ^= binary.BigEndian.Uint32(b[i:])
        }
    
        if padLen != 0 {
            sum ^= binary.BigEndian.Uint32(padding())
        }
    
        return sum
    }
    

    尽量避免内存分配,msg = append(msg, 0xAB) append 会分配内存,seq 不需要转化成 byte slice,因为最后是求 sum,把 data 转 uint32 即可。 原来你用padLen := 4 - length%4是不对的,如果 length 长度是 4 的倍数,你会导致 padLen=4

  • sync.Map delete问题 at 2018年08月07日

    额,第一眼看到这问题的排版,真是不想回答啊。。。markdown 了解一下。如果read map和dirty map同时存在该元素,将read map中的元素置为nil,等同于将dirty map的元素置为nil,因为read map和dirty map 使用的是同一个元素地址

  • udp组播效率问题。 at 2018年08月05日

    用组播来做视频播放吗?你这问题描述的不清楚啊,效率好像不好?给个数据来说话。用 vlc 播放,只能播放很小一部分?什么叫只能播放一小部分?

  • 这个问题已经有不少文章讲了,for {}这种死循环(现实中应该用不着,反正我没用过这种需求),编译的时候不会被 go 插入抢占的代码(morestack 函数),导致调度切换不出去。这个问题 go 团队已经在着手解决了 https://github.com/golang/go/issues/24543,不理解的话,可以看看https://tonybai.com/2017/11/23/the-simple-analysis-of-goroutine-schedule-examples/

  • upx?

  • 靠,其他语言辣么多,我他么怎么知道,开玩笑的!

    如果和 C 语言比的话,C 的 main 入口函数就是启动进程后 jump 过去的地址。 而在 go 中,相当于 C 语言的 main 入口函数,go runtime 已经帮你写好了,你写的 main func in package main,是 go 的 runtime 帮你启动的,而且它是个 goroutine。详细可以看看 golang 源码阅读笔记 雨痕老师的,在 github 上一搜就有。。