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 一个字符串表达式替换的函数的更多相关文章

  1. 使用CodeDOM动态编译一个字符串表达式

    由于程序需要,计算的表达式使用字符串传输,这样对运算造成了影响.在程序中直接执行这段表达式可以得到值, 但是使用字符串就没有办法运算了, 所以想到用CodeDOM将这段字符串拼接在代码中编译 类似st ...

  2. sql server的一个字符串分割的表值函数方法

    ALTER function [dbo].[BOSplit](@SourceSql nvarchar(max),  --要分割的字段@StrSeprate varchar(10)      --分割符 ...

  3. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数

    t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数 源自:Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expre ...

  4. 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可以执行一个字符串形式 ...

  5. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  6. golang中字符串内置函数整理

    字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...

  7. delphi 字符串查找替换函数 转

    1.       提取字符串中指定子字符串前的字符串 Function Before( Src:string ; S:string ): string ; Var   F: Word ; begin ...

  8. PHP字符串替换str_replace()函数4种用法详解

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )该函数返回一个字符串 ...

  9. 机器学习入门-文本数据-构造词频词袋模型 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- ...

随机推荐

  1. BZOJ 3193: [JLOI2013]地形生成 计数 + 组合 + 动态规划

    第一问: 先不考虑山的高度有相同的:直接按照高度降序排序,试着将每一座山插入到前面山的缝隙中. 当然,这并不代表这些山的相对位置是固定的,因为后面高度更低的山是有机会插入进来的,所以就可以做到将所有情 ...

  2. 微信浏览器video播放视频踩坑

    video属性介绍 iOS的属性 playsinline On iPhone, video playsinline elements will now be allowed to play inlin ...

  3. DVWA--upload

    文件上传漏洞 0x01了解文件上传漏洞的用处是用来干什么的 什么是文件上传漏洞? 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执 ...

  4. ArrayList类源码浅析(一)

    1.首先来看一下ArrayList类中的字段 可以看出,ArrayList维护了一个Object数组,默认容量是10,size记录数组的长度: 2.ArrayList提供了三个构造器:ArrayLis ...

  5. GIT的工作原理和基本命令

    1.GIT的工作原理 工作区:我们写代码的地方. 暂存区:临时存储用的. 历史区:生成历史版本的地方. 提交流程:工作区->暂存区->历史区 图示: 2.GIT的全局配置 3.创建仓库完成 ...

  6. linux 设置 hugepage

    临时设置 hugepage > /sys/kernel/mm/hugepages/hugepages-16384kB/nr_hugepages 查看是否设置成功 cat /proc/meminf ...

  7. c/c++二级指针动态开辟内存

    c版: #include <stdio.h> #include <stdlib.h> #define row 4 #define col 8 int main() { int ...

  8. ssm+ajax异步请求返回list遍历

    jsp页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnc ...

  9. 洛谷P1190 接水问题

    题目名称:接水问题 题目来源 [洛谷P1190] (https://www.luogu.org/problemnew/show/P1190)​ 题目描述 学校里有一个水房,水房里一共有\(m\)个龙头 ...

  10. 【1】mongoDB 的安装及启动

    MongoDB是一个面向文档(document-oriented)的数据库,不是关系型数据库.与关系型数据库相比,面向文档的数据库没有"行"的概念,取而代之的是"文档&q ...