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- ...
随机推荐
- 从1G到5G发展史(3GPP是个什么组织 为啥5G标准离不开它)
1.“3GPP”组织建立的来龙去脉 3GPP一直以来在人们心中是一个神秘的组织,很多用户对于它的理解和认知,说不清,道不明.最近关于5G网络的诸多报道,都陈述了“5G网络”的标准是由“3GPP”来规定 ...
- 能给个安全点的fifo吗
调试一个基于altera FPGA的项目,发现开机200次,就会有1到2次的开机不正常现象,但只要是成功开机了,无论运行多久都是正常的. 遇到这类问题,按照经验来说 一般首先想到的可能是电源 ...
- #381 Div2 Problem C Alyona and mex (思维 && 构造)
题意 : 题目的要求是构造出一个长度为 n 的数列, 构造条件是在接下来给出的 m 个子区间中, 要求每一个子区间的mex值最大, 然后在这 m 个子区间产生的mex值中取最小的输出, 并且输出构造出 ...
- Luogu P4550 收集邮票
题目链接:Click here Solution: 本题直接推价格似乎很难,考虑先从购买次数入手 设购买次数\(g(i)\)为当前有\(i\)种不同的邮票,要买到\(n\)种的期望购买次数 可以由期望 ...
- ApiException
ApiException 用于在catch中throw 异常,可以添加异常信息, throw new ApiException("线下绑卡异常!"); public class A ...
- antd form表单一行多个组件并对其校验
一行一个标签对应多个输入组件,这个需求很常见但在官方例子没看到合适的,因为官方建议: 注意:一个 Form.Item 建议只放一个被 getFieldDecorator 装饰过的 child,当有多个 ...
- CentOS7服务器配置
CentOS7服务器配置 1.更换yum软件源 下载阿里源 cd /etc/yum.repos.d sudo wget -nc http://mirrors.aliyun.com/repo/Cento ...
- ubuntu 18.04 gcc g++降级4.8版
$ sudo apt-get install -y gcc-4.8 $ sudo apt-get install -y g++-4.8 $ cd /usr/bin $ sudo rm gcc $ su ...
- Hibernate一级缓存之懒加载问题
Hibernate的懒加载: 当用到数据的时候才向数据库查询,这就是hibernate的懒加载特性. 目的,为提高程序执行效率. 查询操作:get()方法/load()方法 (1)get()方法,及时 ...
- VS调试异常代码 HRESULT:0x80070057 (E_INVALIDARG)解决方法
我目前在做的一个系统是VS2010写的的B/S架构程序, 主要技术是:C#.SQLSERVER2008.NHibernate,Python,Nhibernate 的*.hbn.xml是映射数据库的表结 ...