初级会员
  • 第 2573 位会员
  • heimeil
  • 894433590@qq.com
  • 2015-03-24 09:19:44
  • Offline
  • 26 84

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • https://github.com/slonzok/getpass
  • 实际上Go里面只有值传递,就算表象是传递了引用,其实传递的还是一个指针类型的值。 要表象上去观察值传递或引用传递,看值的类型就行了,基础类型和数组还有指针都是值类型,直接对应在内存里存储实际数据,表现出来就是值传递,而`slice map chan`底层都是复杂的结构体,比如[https://golang.org/pkg/reflect/#SliceHeader](https://golang.org/pkg/reflect/#SliceHeader),结构体有个指针指向的才是真正的数据内容,这个结构体虽然在传递的时候是做的值拷贝,但数据内容都不会因此丢失或篡改,里面指针的值还是指向了实际数据的内存地址,这个引用关系还继续保持着在,还能继续访问原始值。 这样打印一下就能看清楚一点了: ```go fmt.Println(unsafe.Pointer(&bulk)) sliceChan <- bulk e := <-sliceChan fmt.Println(e) fmt.Println(unsafe.Pointer(&e)) ``` 另外指针都可以继续再引用,就是指向指针的指针了。
  • `gin.Context`是针对单个请求的上下文,可以保证一个`x`对应一个请求,单个请求内多个中间件的调用是没问题的。如果你这个`goo`多个相同的输入产出的都是相同的结果并且计算比较耗时,就可以优化一下,把计算出来的值用`map`缓存一下,`st`作为键,`goo`里面计算前获取一下,如果有直接返回,这样多次请求都能共享计算结果,当然前提就是看这个`goo`是不是只依赖`st`这个外部参数的,还有如果计算不耗时和调用不密集就没有优化的必要了。
  • #1 @wjx0912 可以思考一下上面的等价转换,变成了`func print(p field)`,这样传参就是copy了。 另外补充一下,`range data2`的`go v.print()`下面加一个`runtime.Gosched()`,也可以输出`four five six`,意思是交出执行权给其他goroutine,这样`for`循环就暂停了,直接执行`v.print()`了
  • 评论了主题 Go的channel问题
    长度0表示无缓冲的channel,存值的时候会阻塞,你这样代码就无法往下执行了