defia

第 1590 号会员 /

回复了 hewei861124 创建的主题: http反向代理包中io.copy的性能不佳,有更好的替代方案

其实io.Copy和你的代码都不好。

io.Copy,每次都需要make一个特定长度的[]byte,会增大gc负担 应该使用sync.Pool,或者类似shadowsocks-go中的LeakyBuff的实现来复用[]byte并自己实现Copy

你的代码除了上几个回帖提到的没有采用流处理思想的问题外,ioutil.ReadAll,这个函数底层是用bytes.Buffer实现的,bytes.Buffer是一个自己按需grow的[]byte,开销也很大,也应该用上述方法,使用复用[]byte的Copy。

回复了 jesse 创建的主题: go代码用1.4编译后出现内存回收错误

@FlashKnight 我运行了一下,在64bit系统上会使用超过4G内存,但是没有崩溃。32bit下崩溃了。 不过也正常,append每次都会生成一个新slice。这样的代码本身就不合理

回复了 manzhiyong 创建的主题: 如何在循环内声明可在该作用域外起作用的变量

这个意思?

type AgentLogin struct {
    UserName   string
    Password   string
    RePassword string
}

func main() {
    structName := "AgentLogin"
    for {
        fmt.Println(structName)
        var s interface{}
        if structName == "AgentLogin" {
            s = new(AgentLogin)
        } else {
            continue
        }
        err := json.Unmarshal([]byte(`{"username":"1","password":"2","repassword":"3"}`), s)
        if err != nil {
            log.Println(err)
            break
        }
        fmt.Println(s.(*AgentLogin).UserName)
    }

}

回复了 shenjiayu 创建的主题: 算法求解。。

必然啦 不过需要注意的是 直接穷举除了要判断一个数字是否使用2次外,还需要注意防止同样组合不同顺序的结果

可以先对原始数组进行排序,然后例如第一个数字是6了以后,就直接从6后面的7开始,这样可以很简单的避免组合重复,如果数字本身没重复的话,也可以避免数字重复

就是 for a:=0;a < length;a++{ for b:=a+1;b < length;b++{ ....以此类推 } } 顺带从小到大排序之后还可以优化速度,比如现在加上第四个数字已经大于30了,那之后的第四个数字的可能性都抛弃,直接到第三个数字的下个循环

回复了 shenjiayu 创建的主题: 算法求解。。

固定是size4也太简单了连递归都不需要,直接四重循环就搞定...楼主你自己练习吧

回复了 clevertension 创建的主题: go里面的函数, func后面直接的括号是啥意思

用其他语言的概念的话,就是类的方法,调用的语法也类似 这个例子中work函数是Worker类的方法.然后调用这个方法的对象以指针形式以参数w传入函数内 其实就是func work(w *Worker,done chan *Worker)的语法糖