zoukankan      html  css  js  c++  java
  • 随便记记(一)

    一、for循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    - 常规
    for i := 0; i < count; i++ {}
    - "while"
    for condition { }
    - "do-while"
    for {
    doSomething()
    if condition { break }
    }
    - iterator loop
    for k, v := range f.Value {}
    - dead loop
    for {}

    二、Orthogonal Composition
    1、vertical composition thought(垂直组合思维)
    Go语言通过type embedding实现垂直组合。组合方式莫过于以下这么几种:

    a) construct interface by embedding interface
    通过在interface中嵌入interface type name,实现接口行为聚合,组成大接口。这种方式在stdlib中尤为常用。

    1
    2
    3
    4
    type ReadWriter interface {
    Reader
    Writer
    }

    b) construct struct by embedding interface

    1
    2
    3
    4
    type MyReader struct {
    io.Reader // underlying reader
    N int64 // max bytes remaining
    }

    c) construct struct by embedding struct

    1
    2
    3
    4
    5
    6
    7
    // sync/pool.go
    type poolLocal struct {
    private interface{} // Can be used only by the respective P.
    shared []interface{} // Can be used by any P.
    Mutex // Protects shared.
    pad [128]byte // Prevents false sharing.
    }

    在struct中嵌入interface type name和在struct嵌入struct,都是“ 大专栏  随便记记(一)委派模式(delegate)”的一种应用。在struct中嵌入interface方便快速构建满足某一个interface的dummy struct,方便快速进行unit testing,仅需实现少数需要的接口方法即可,尤其是针对Big interface时。

    struct中嵌入struct,被嵌入的struct的method会被提升到外面的类型中,比如上述的poolLocal struct,对于外部来说它拥有了Lock和Unlock方法,但是实际调用时,method调用实际被传给poolLocal中的Mutex实例。
    2、small interface thought(小接口思维)
    interface是Go语言真正的魔法。前面提到过,interface好比程序肌体的骨架关节,上下连接着骨架部件。interface决定了Go语言中类型的水平组合方式。interface与其实现者之间的关系是隐式的,无需显式的”implements”声明(但编译器会做静态检查);interface仅仅是method集合,而method和普通function一样声明,无需在特定位置。

    3、horizontal composition thought(水平组合思维)
    middleware这个词的含义可大可小,在Go Web编程中,常常指的是一个满足Handler interface的HandlerFunc类型实例。实质上:

    1
    middleware = wrapper function + adapter function type

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    func (h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    t := time.Now()
    log.Printf("[%s] %q %vn", r.Method, r.URL.String(), t)
    h.ServeHTTP(w, r)
    })
    }
    func authHandler(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    err := validateAuth(r.URL.Query().Get("auth"))
    if err != nil {
    http.Error(w, "bad auth param", http.StatusUnauthorized)
    return
    }
    h.ServeHTTP(w, r)
    })
    }
    func main() {
    http.ListenAndServe(":8080", logHandler(authHandler(http.HandlerFunc(index))))
    }

  • 相关阅读:
    SpringBoot 如何生成接口文档,老鸟们都这么玩的!
    ELK 外网访问
    Elasticsearch 7.x配置用户名密码访问 开启x-pack验证
    在centos7 中安装Kibana
    在centos7 安装Elasticsearch 步骤:
    cuda-pytorch-gpu快速配置
    Face 2 to 3 D
    PointNet++
    PointNet:Deep Learning on Point Sets for 3D Classification and Segmentation
    3D Face Modeling From Diverse Raw Scan Data
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12286147.html
Copyright © 2011-2022 走看看