前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go: 格式化字符串,类似于python

go: 格式化字符串,类似于python

作者头像
超级大猪
发布2019-11-22 09:36:21
6540
发布2019-11-22 09:36:21
举报
文章被收录于专栏:大猪的笔记

写了一个格式化字符串的包。提供类似于Python的写法,目前只能做玩具

代码语言:javascript
复制
package helper

import (
    "fmt"
    "strconv"
    "strings"
)

func Fmt(format string, args ...interface{}) string {
    argsWithKey := []string{}
    for i, v := range args {
        argsWithKey = append(argsWithKey, "{"+strconv.Itoa(i)+"}")
        argsWithKey = append(argsWithKey, fmt.Sprintf("%v", v))
    }

    format = getFormat(format)
    r := strings.NewReplacer(argsWithKey...)
    return r.Replace(format)
}

func getFormat(format string) string {
    // 先用 {{  }}切分成数组
    arr := []string{}

    start := 0
    i := 0
    for i < len(format) {
        // 找到一个 {{
        if format[i] == '{' && i+1 < len(format) && format[i+1] == '{' {
            arr = append(arr, format[start:i])
            arr = append(arr, "{{")
            i += 2
            start = i
        }
        // 找到一个 }}
        if format[i] == '}' && i+1 < len(format) && format[i+1] == '}' {
            arr = append(arr, format[start:i])
            arr = append(arr, "}}")
            i += 2
            start = i
        }
        i++
    }
    if start < len(format) {
        arr = append(arr, format[start:])
    }

    // 此时,只剩下了 {},往里面填数字,{} {} -> {0} {1}
    quotoNum := 0
    for arrIndex, v := range arr {
        tempStr := v
        for true {
            pos := strings.Index(tempStr, "{}")
            if pos == -1 {
                break
            }
            tempStr = tempStr[:pos] + "{" + strconv.Itoa(quotoNum) + "}" +
                tempStr[pos+2:]
            quotoNum++
        }
        arr[arrIndex] = tempStr
    }

    result := ""
    for _, v := range arr {
        v = strings.Replace(v, "{{", "{", -1)
        v = strings.Replace(v, "}}", "}", -1)
        result += v
    }
    return result
}

测试:

代码语言:javascript
复制
logger.Infoln(helper.Fmt("{0}ha{1}{{{1}", "hello", "world"))
    logger.Infoln(helper.Fmt("{}ha{}{{{}", "hello", "world", "haha"))
    logger.Infoln(helper.Fmt("{{}}{}", "hello"))
    logger.Infoln(helper.Fmt("{{}}{}{}", "hello", "world"))
    logger.Infoln(helper.Fmt("{} is a big.{}", "大猪", "ha"))
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档