效率还是效率


给如下结构体实现 error 接口

type codeError struct {
    code  int64
    cause error
    msg   string
}

效率重视型:

func (err codeError) Error() string {
    msg := fmt.Sprintf("error code: %d", err.code)
    if err.msg != "" {
        msg += fmt.Sprintf(", msg:%s", err.msg)
    }
    if err.cause != nil {
        msg += fmt.Sprintf(", cause:%s", err.cause.Error())
    }
    return msg
}

效率重视型:

func (err codeError) Error() string {
    msgSlice := make([]string, 0, 6)
    msgSlice = append(msgSlice,
        "error code: ",
        strconv.FormatInt(err.code, 10),
    )
    if err.msg != "" {
        msgSlice = append(msgSlice,
            ", msg: ",
            err.msg,
        )
    }
    if err.cause != nil {
        msgSlice = append(msgSlice,
            ", cause: ",
            err.cause.Error(),
        )
    }

    builder := strings.Builder{}
    builder.Grow(len(msgSlice))

    for _, s := range msgSlice {
        builder.WriteString(s)
    }

    return builder.String()
}