golang 一个字符串表达式替换的函数
package util import (
"fmt"
"reflect"
"regexp"
"strconv"
"strings"
) func floatToString(f float64) string {
return strconv.FormatFloat(f, 'E', -1, 64)
}
func intToString(i int64) string {
return strconv.FormatInt(i, 10)
}
func boolToString(b bool) string {
if b {
return "true"
} else {
return "false"
}
} func toString(arg interface{}) string {
switch arg.(type) {
case bool:
return boolToString(arg.(bool))
case float32:
return floatToString(float64(arg.(float32)))
case float64:
return floatToString(arg.(float64))
//case complex64:
// p.fmtComplex(complex128(f), 64, verb)
//case complex128:
// p.fmtComplex(f, 128, verb)
case int:
return intToString(int64(arg.(int)))
case int8:
return intToString(int64(arg.(int8)))
case int16:
return intToString(int64(arg.(int16)))
case int32:
return intToString(int64(arg.(int32)))
case int64:
return intToString(int64(arg.(int64)))
default:
return fmt.Sprint(arg)
}
} func combinePath(pre string, path string) string {
if pre != "" && path != "" {
return pre + "." + path
}
return pre + path
} //将一个map[string]interface打平
func FlatMap(prefix string, mapData map[string]interface{}) map[string]interface{} {
v := reflect.ValueOf(mapData)
res := make(map[string]interface{})
foreachObj(prefix, v, res)
return res
} func foreachObj(pre string, v reflect.Value, res map[string]interface{}) {
switch v.Kind() {
case reflect.Ptr:
foreachObj(pre, v.Elem(), res)
case reflect.Array, reflect.Slice:
for i := 0; i < v.Len(); i++ {
foreachObj(combinePath(pre, strconv.Itoa(i)), v.Index(i), res)
}
case reflect.Struct:
vType := v.Type()
for i := 0; i < v.NumField(); i++ {
foreachObj(combinePath(pre, vType.Field(i).Name), v.Field(i), res)
}
case reflect.Map:
for _, key := range v.MapKeys() {
foreachObj(combinePath(pre, key.String()), v.MapIndex(key), res)
}
case reflect.Interface:
foreachObj(combinePath(pre, ""), v.Elem(), res)
default: // float, complex, bool, chan, string,int,func, interface
res[pre] = v.Interface()
}
} func getTplExpressions(str string) []string {
reg_str := `\$\{.*?\}`
re, _ := regexp.Compile(reg_str)
all := re.FindAll([]byte(str), 2)
keyArrays := make([]string, 0)
for _, item := range all {
item_str := string(item)
if len(item_str) > 3 {
item_str = item_str[2 : len(item_str)-1]
keyArrays = append(keyArrays, item_str)
} }
return keyArrays
} // 将tpl中的占位符 替换为真实值 ${data.0.att1}
func ParseTpl(tpl string, data map[string]interface{}) string {
if len(tpl) < 4 {
return tpl
}
expressions := getTplExpressions(tpl)
data = FlatMap("", data)
for _, exp := range expressions {
//fmt.Println("exp",exp)
exp = strings.TrimSpace(exp)
tpl = strings.Replace(tpl, "${"+exp+"}", toString(data[exp]), -1)
}
return tpl
}
golang 一个字符串表达式替换的函数的更多相关文章
- 使用CodeDOM动态编译一个字符串表达式
由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响.在程序中直接执行这段表达式可以得到值, 但是使用字符串就没有办法运算了, 所以想到用CodeDOM将这段字符串拼接在代码中编译 类似st ...
- sql server的一个字符串分割的表值函数方法
ALTER function [dbo].[BOSplit](@SourceSql nvarchar(max), --要分割的字段@StrSeprate varchar(10) --分割符 ...
- t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数
t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数 源自:Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expre ...
- divmod(a,b)函数是实现a除以b,然后返回商与余数的元组、eval可以执行一个字符串形式的表达式、exec语句用来执行储存在字符串或文件中的Python语句
#!/usr/bin/env python a = 10/3 print(a) #divmod计算商与余数 r = divmod(10001,20) print(r) #eval可以执行一个字符串形式 ...
- SQL中字符串截取、连接、替换等函数的用法
一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...
- golang中字符串内置函数整理
字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...
- delphi 字符串查找替换函数 转
1. 提取字符串中指定子字符串前的字符串 Function Before( Src:string ; S:string ): string ; Var F: Word ; begin ...
- PHP字符串替换str_replace()函数4种用法详解
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )该函数返回一个字符串 ...
- 机器学习入门-文本数据-构造词频词袋模型 1.re.sub(进行字符串的替换) 2.nltk.corpus.stopwords.words(获得停用词表) 3.nltk.WordPunctTokenizer(对字符串进行分词操作) 4.np.vectorize(对函数进行向量化) 5. CountVectorizer(构建词频的词袋模型)
函数说明: 1. re.sub(r'[^a-zA-Z0-9\s]', repl='', sting=string) 用于进行字符串的替换,这里我们用来去除标点符号 参数说明:r'[^a-zA-Z0- ...
随机推荐
- 带 like 的字符串匹配查询
1.百分号通配符 '%' ,匹配任意长度的字符,甚至包括零字符 例:查询所有以 'a' 字母开头的水果,sql 语句如下 select f_id,f_name from fruits wher ...
- luogu 4927 [1007]梦美与线段树 概率与期望 + 线段树
考场上切了不考虑没有逆元的情况(出题人真良心). 把概率都乘到一起后发现求的就是线段树上每个节点保存的权值和的平方的和. 这个的修改和查询都可以通过打标记来实现. 考场代码: #include < ...
- eclipse中使用maven搭建多模块项目
暂时参考:https://blog.csdn.net/u012343297/article/details/79883870
- 【BZOJ3931】[CQOI2015]网络吞吐量
Description 路由是指通过计算机网络把信息从源地址传输到目的地址的活动,也是计算机网络设计中的重点和难点.网络中实现路由转发的硬件设备称为路由器.为了使数据包最快的到达目的地,路由器需要选择 ...
- matlab中句柄@的用法
@是Matlab中的句柄函数的标志符,即间接的函数调用方法. 1 句柄函数 主要有两种语法: handle = @functionname handle = @(arglist)anonymous_f ...
- mini-batch
我们在训练神经网络模型时,最常用的就是梯度下降,梯度下降有一下几种方式: 1.Batch gradient descent(BGD批梯度下降) 遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度 ...
- H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。
手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在 ...
- mac 绑定阿里企业邮箱
注意事项: 1. 收件服务器 千万得写对, 选 pop 就写 pop.mxhichina.com; 选 imap 就写 imap.mxhichina.com 2. 发件服务器 必须写,smtp.mxc ...
- UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
NOI2019考前做NOI2018题.. 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=5417 (luogu) http ...
- 组件内导航之beforeRouteUpdate的使用
使用场景: 组件复用:路由跳转: beforeRouteUpdate (to, from, next) { // 在当前路由改变,但是该组件被复用时调用 // 举例来说,对于一个带有动态参数的路径 / ...