Golang-代码片段

234 阅读1分钟
var (
   _encoderNameToConstructor = map[string]func(zapcore.EncoderConfig) (zapcore.Encoder, error){
      "console": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
         return zapcore.NewConsoleEncoder(encoderConfig), nil
      },
      "json": func(encoderConfig zapcore.EncoderConfig) (zapcore.Encoder, error) {
         return zapcore.NewJSONEncoder(encoderConfig), nil
      },
   }
)
func withStackTracer(h http.Handler, l log.Logger) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		defer func() {
			if err := recover(); err != nil {
				const size = 64 << 10
				buf := make([]byte, size)
				buf = buf[:runtime.Stack(buf, false)]
				level.Error(l).Log("msg", "panic while serving request", "client", r.RemoteAddr, "url", r.URL, "err", err, "stack", buf)
				panic(err)
			}
		}()
		h.ServeHTTP(w, r)
	})
}
// 实现超时
// https://github.com/etcd-io/etcd/blob/main/etcdutl/etcdutl/backup_command.go
var src *bolt.DB
ch := make(chan *bolt.DB, 1)
go func() {
   db, err := bolt.Open(srcDB, 0444, &bolt.Options{ReadOnly: true})
   if err != nil {
      lg.Fatal("bolt.Open FAILED", zap.Error(err))
   }
   ch <- db
}()
select {
   case src = <-ch:
   case <-time.After(time.Second):
      lg.Fatal("timed out waiting to acquire lock on", zap.String("srcDB", srcDB))
      src = <-ch
   }
defer src.Close()

// orchestrator-master/go/inst/instance_dao.go
func ReadTopologyInstanceBufferable(instanceKey *InstanceKey, bufferWrites bool, latency *stopwatch.NamedStopwatch) (inst *Instance, err error) {
   defer func() {
      if r := recover(); r != nil {
         err = logReadTopologyInstanceError(instanceKey, "Unexpected, aborting", fmt.Errorf("%+v", r))
      }
   }()
    var waitGroup sync.WaitGroup
    errorChan := make(chan error, 32)
    //利用协程实现无依赖的并发检测
    {
	waitGroup.Add(1)
	go func() {
            defer waitGroup.Done()
            err := ...

            if err != nil {
            }
            errorChan <- err
	}()
    }
        {
	waitGroup.Add(1)
	go func() {
            defer waitGroup.Done()
            err := ...

            if err != nil {
            }
            errorChan <- err
	}()
    }
    if 关键流程有问题呢 {
        goto Cleanup
    }
Cleanup:
    waitGroup.Wait()
    close(errorChan)
    err = func() error {
	if err != nil {
            return err
        }
        for err := range errorChan {
            if err != nil {
		return err
            }
        }
        return nil
    }()
// break 配合 label 跳出指定代码块
//没有指定标签的 **break** 只会跳出 **switch/select** 语句,若不能使用 **return** 语句跳出的话,可为 **break** 跳出标签指定的代码块
//https://segmentfault.com/a/1190000039887310?utm_source=sf-similar-article
func main() {
loop:
    for {
        switch {
        case true:
            fmt.Println("breaking out...")
            //break    // 死循环,一直打印 breaking out...
            break loop
        }
    }
    fmt.Println("out...")
}