golang小记

  • float转int报错
    必须使用变量作为中介

  • append
    当切片容量足够时,进行append操作,会引起原切片数据变化。

    func test() {
      nums := []int{1, 2, 3}
      _ = append(nums[:2], 4)
      fmt.Println("test1:", nums)
    

    输出:

    test: [1 2 4]
    
  • 深度拷贝map、struct
    用json.unmarshal,变成字符串,然后再用 json.marshal生成新的map/struct

  • 拷贝interface
    基于序列化和反序列化

    func deepCopy(dst, src interface{}) error {
        var buf bytes.Buffer
        if err := gob.NewEncoder(&buf).Encode(src); err != nil {
            return err
        }
        return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
    }
    
  • 拷贝slice
    预分配足够空间,然后用拷贝函数

    copyData := make([]int, elementCount)
    copy(copyData, srcData)
    
  • 比较interface
    先比较动态类型,再比较值;
    或者

  • 比较struct
    reflect.DeepEqual

  • 为什么 go 能支持调度上百万个 goroutine ?调度器原理是什么?
    协程,开销小

  • 优雅关闭channel及判断

    type MyChannel struct {
      C      chan T
      closed bool
      mutex  sync.Mutex
    }
    
    func NewMyChannel() *MyChannel {
        return &MyChannel{C: make(chan T)}
    }
    
    func (mc *MyChannel) SafeClose() {
        mc.mutex.Lock()
        defer mc.mutex.Unlock()
        if !mc.closed {
            close(mc.C)
            mc.closed = true
        }
    }
    
    func (mc *MyChannel) IsClosed() bool {
        mc.mutex.Lock()
        defer mc.mutex.Unlock()
        return mc.closed
    }
    
  • 假如某一个 http 请求会有以下四个 goroutine 的调用链,如何通知这四个 goroutine 退出?有什么比较好的方案?
    context包
    当通过父Context对象创建子Context对象时,可同时获得子Context的一个撤销函数,这样父Context对象的创建环境就获得了对子Context将要被传递到的Goroutine的撤销权.
    在子Context被传递到的goroutine中,应该对该子Context的Done信道(channel)进行监控,一旦该信道被关闭(即上层运行环境撤销了本goroutine的执行),应主动终止对当前请求信息的处理,释放资源并返回.

  • channel 和锁分别用在什么情况下?二者性能差异如何?
    channel用于传数据,锁控制并发
    锁的性能是channel的3倍左右

  • struct{}场景
    节省内存(map、channel)
    封装

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容