首页 > 其他分享 >使用golang灵活处理动态文案

使用golang灵活处理动态文案

时间:2023-07-22 20:55:15浏览次数:25  
标签:allVariables cpWritingMap golang key variableMap 灵活处理 TODO 文案

代码

package scripts_stroage

import (
    "fmt"
    "github.com/duke-git/lancet/v2/slice"
    "github.com/gogf/gf/util/gconv"
    "github.com/gookit/goutil/dump"
    "regexp"
    "strings"
    "testing"
)

const (

    // 有些变量variableMap中没有,但是传来的fmt字符串中有,需要加固定的逻辑校验
    userNameVariable = "${userName}"

    // 有些变量优先使用传来的,如果传来的是空 需要从其他地方获取
    taskNameVariable = "${taskName}"

    // 模拟的一个用户名 TODO 实际上会从 数据库/Redis/ctx 中获取~
    userNameModel = "Naruto火影大人"
)

func copyWritingConfig() (variableMap map[string]interface{}, copyWritingFmtText string) {

    variableMap = make(map[string]interface{})

    // 文案的 变量名、变量值 —— Notice 数量不固定
    variableMap["${taskName}"] = "实况足球以10:0完成比赛任务"
    variableMap["${rewardUrl}"] = `<a href="/reward/get">奖励页面</a>`

    variableMap["${rechargeUrl}"] = `<a href="/recharge/get">充值页面</a>`
    variableMap["${tenYuan}"] = "10元"
    variableMap["${tenYuanReward}"] = "抽取哈兰德机会卡。"
    // TODO ...

    // 文案格式化的字符串
    copyWritingFmtText = "尊敬的用户:${userName},恭喜您完成了${taskName},请立刻前往${rewardUrl}去领取。\n" +
        "另外如果您在${rechargeUrl}充值${tenYuan},您将获得${tenYuanReward}"

    return
}

type CopyWritingMap map[string]interface{}

func (c CopyWritingMap) keys() []any {
    keys := make([]any, 0)
    for key := range c {
        keys = append(keys, key)
    }

    return keys
}

// 使用正则匹配出 ${xxx} 这样的字符串
func GetCopyWritingVariableName(fmtStr string) []string {

    // 预编译
    re := regexp.MustCompile(`\$\{\w+}`)
    matches := re.FindAllString(fmtStr, -1)

    return matches
}

// TODO 实际中的需求是:在管理后台配置好文案变量以及变量对应的值、文案格式化的字符串,C端的接口拿着这些配置去生成文案
// TODO 如果直接把配置一点都不处理的存下来,下面的代码放在C端接口执行的话那么效率还是非常低的(有正则匹配、大量的字符串替换)
// TODO 实际上,我们可以在"管理后台存储"的时候,将文案格式化的字符串"预处理一下":比如把正则匹配的逻辑放到管理后台接口,先生成一个"经过预处理的格式化文案"
// TODO 对于那些需要C端接口获取的变量 比如 ${userName},当我们遇到这样的变量后,再查一遍然后替换"经过预处理的格式化文案"中对应的变量即可
// TODO 管理后台预处理后可以暂时将文案存起来:
/*
    // 关键字段
    foreign_key_xxx(比如绑定任务id、用户id等等):xxx
    pre_copy_writing_fmt_text: "尊敬的用户:${userName},恭喜您完成了实况足球赛季2任务,请立刻前往<a href="/reward/get">奖励页面</a>去领取。"
    variable_list(json序列化的text类型的字段,为空记录[],数量必须跟上面的变量的数量一样): ["${userName}"]
*/

func TestGenCopyWriting(t *testing.T) {

    variableMap, copyWritingFmtText := copyWritingConfig()
    if len(variableMap) < 1 || copyWritingFmtText == "" {
        return
    }

    // 使用正则匹配 ${xxx} 有哪些.....
    allVariables := GetCopyWritingVariableName(copyWritingFmtText)
    // Notice 没有变量 直接返回
    if len(allVariables) == 0 {
        fmt.Println("没有变量! ")
        return
    }

    fmt.Println("allVariables: ", allVariables)

    cpWritingMap := CopyWritingMap{}

    // Notice 1、variableMap中 需要单独查询的变量
    if slice.Contain(allVariables, userNameVariable) {
        // TODO 实际上应该从其他地方查用户名,这里省略了...
        cpWritingMap[userNameVariable] = userNameModel
    }

    for key := range variableMap {
        // Notice 对于 taskName,优先使用传来的,如果传来的是空需要通过RPC获取任务名
        if key == taskNameVariable && variableMap[key] == "" {
            // TODO 通过RPC获取任务名再构建variableMap,
            // TODO 加完后记得continue...略...
        }

        if gconv.String(variableMap[key]) != "" {
            cpWritingMap[key] = variableMap[key]
        }
    }

    fmt.Println(">>>>>>cpWritingMap: ")
    dump.P(cpWritingMap)

    if len(cpWritingMap) < 1 {
        return
    }
    // Notice 实际上 cpWritingMap 与 allVariables 的长度应该一样!
    if len(cpWritingMap) != len(allVariables) {
        fmt.Printf("allVariables的长度与cpWritingMap的长度不一致!")
        dump.P(allVariables)
        dump.P(cpWritingMap)
        return
    }

    // 使用 strings.Replace 进行替换
    for key := range cpWritingMap {
        copyWritingFmtText = strings.Replace(copyWritingFmtText, key, gconv.String(cpWritingMap[key]), -1)
    }

    fmt.Println("result: ", copyWritingFmtText)
    /*
        尊敬的用户:Naruto火影大人,恭喜您完成了实况足球以10:0完成比赛任务,请立刻前往<a href="/reward/get">奖励页面</a>去领取。
        另外如果您在<a href="/recharge/get">充值页面</a>充值10元,您将获得抽取哈兰德机会卡。
    */
}

~~~

标签:allVariables,cpWritingMap,golang,key,variableMap,灵活处理,TODO,文案
From: https://www.cnblogs.com/paulwhw/p/17574226.html

相关文章

  • golang 实现 RPC(远程过程调⽤实例)
    golang实现RPC 前提概要,先了解几个概念,websocket简介什么是websocketWebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议webs......
  • Golang 中 Gin 框架开发学习记录 ——(二)
    4、响应页面  首先创建template文件夹将需要的hmtl文件放在里面,然后编写hmtl<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>我的GOweb页面</title><linkrel="stylesheet"href=&......
  • linux Vim配置Golang语言环境
    下载vim要配置Linux上的Vim,可以按照以下步骤进行操作:打开终端并运行以下命令安装Vim:sudoapt-getupdatesudoapt-getinstallvim12在主目录下创建.vimrc文件:cd~touch.vimrc12编辑.vimrc文件并添加您想要的配置选项。例如,您可以添加以下行以启用语法高亮和......
  • Golang中Gin框架开发学习记录——(一)
    1、环境配置    在GO语言中,使用"goget"命令获取相关包"goget"命令的作用与“gitclone”类似,这里使用:goget-ugithub.com/gin-gonic/gin来获取,相关代理问题可以参考以下链接:(19条消息)解决GO安装gin框架(goget-ugithub.com/gin-gonic/gin)超时问......
  • golang io复用端口监听
    开发高性能server的时候,不可避免的需要接触到io复用——多个线程或者进程,可以创建一个或多个监听程序(监听同一个地址和端口),并且可以多个线程接收数据,让系统进行负载均衡。不同系统下有不同的模型:windows的iocp,linux的epoll和unix的kqueue。这里只讨论linux下的情况。如果使用io复......
  • golang slice (切片) 扩容机制详解(1.18版本后)
    slice源码定义:typeslicestruct{ arrayunsafe.Pointer//指向底层数组的指针 lenint//切片长度 capint//切片容量}growslice()方法:用于slice的扩容funcgrowslice(et*_type,oldslice,capint)slice{//...... newcap:=old.cap doubleca......
  • golang println与fmt.Println性能差距
    具体原因和底层细节没有仔细看,不做描述,只说一下结果。循环获取UDP的socket数据,满速情况下(每个数据包获取后输出一下当前接收数据包总数),println比fmt.Println慢了1倍。比如发送10万个包,fmt.Println可以接收到9万多,而println只能接收4万~5万......
  • golang实现的 https 协议的四层代理和七层代理
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯四层代理在tcp这一层转发很简单。http协议是明文的,因此在代理上做各种业务逻辑处理都很容易。https协议是密文的,无法读取传输内容。具体代码请见:https://git......
  • Golang的跨平台编译程序
    Golang支持交叉编译,也就是说你在32位平台的机器上开发,可以编译生成64位平台上的可执行程序。交叉编译依赖下面几个环境变量:$GOARCH  目标平台(编译后的目标平台)的处理器架构(386、amd64、arm)$GOOS     目标平台(编译后的目标平台)的操作系统(darwin、freebsd、linux、wind......
  • Golang做的验证码(2)
    前面一篇文章介绍了2个用Golang做的验证码 这里再补充几个:1、在GAE上使用的Google的验证码(ReCAPTCHA)封装https://github.com/ThePiachu/GAE-Go-ReCAPTCHA这个的核心代码只在下面这个文件:https://github.com/ThePiachu/GAE-Go-ReCAPTCHA/blob/master/ReCaptcha/ReCaptcha.go 2、一......