go利用反射获取string字符串对应的值

这篇具有很好参考价值的文章主要介绍了go利用反射获取string字符串对应的值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

import (
   "encoding/json"
   "fmt"
   "github.com/tidwall/gjson"
   "reflect"
   "strconv"
   "strings"
)

type Param struct {
   SGameOpenId string
   GameId      int
   Role        struct {
      AreaId int
      PlatId int
      RoleId string
   }
}

func main() {
   requestStr := `{"fields":"{\"openid\":\"SGameOpenId\",\"role_id\":\"Role.RoleId\",\"gameid\":\"GameId\",\"area\":\"Role.AreaId\", \"platid\":\"Role.PlatId#1:10|0:20\"}"}`
   s := gjson.Get(requestStr, "fields").String()

   p := &Param{
      SGameOpenId: "3375000136",
      GameId:      1191,
      Role: struct {
         AreaId int
         PlatId int
         RoleId string
      }{AreaId: 2, PlatId: 1, RoleId: "this role id"},
   }

   getData(s, p)
}

type ProcessingWebParameters struct {
   dataMap map[string]interface{}
}

func getData(str string, req *Param) {
   var m map[string]interface{}
   json.Unmarshal([]byte(str), &m)
   dataMap := make(map[string]interface{}, 0)
   v := reflect.ValueOf(req)
   for s, i := range m {
      if sl := strings.Split(i.(string), "#"); len(sl) > 1 {
         // Role.PlatId#1:10|0:20
         vv, k := actionStruct(sl[0], &v)
         vl := strings.Split(sl[1], "|")
         compareMap := make(map[string]string)
         for _, s2 := range vl {
            ev := strings.Split(s2, ":")
            compareMap[ev[0]] = ev[1]
         }
         // 判断目标类别
         if k == reflect.Int {
            t := strconv.Itoa(vv.(int))
            if value, ok := compareMap[t]; ok {
               dataMap[s], _ = strconv.Atoi(value)
            }
         } else if k == reflect.String {
            if value, ok := compareMap[vv.(string)]; ok {
               dataMap[s], _ = strconv.Atoi(value)
            }
         }

      } else {
         t, _ := actionStruct(i.(string), &v)
         dataMap[s] = t
      }
   }
   fmt.Println(dataMap)
}

func actionStruct(i string, v *reflect.Value) (interface{}, reflect.Kind) {
   var k reflect.Value
   if ss := strings.Split(i, "."); len(ss) > 1 {
      k = v.Elem().FieldByName(ss[0]).FieldByName(ss[1])
   } else {
      k = v.Elem().FieldByName(i)
   }
   return getValue(&k), k.Kind()
}

func getValue(value *reflect.Value) interface{} {
   switch value.Kind() {
   case reflect.Int:
      return int(value.Int())
   case reflect.String:
      return value.String()
   default:

   }
   return ""
}

文章来源地址https://www.toymoban.com/news/detail-445163.html

到了这里,关于go利用反射获取string字符串对应的值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • String字符串

    直接创建 代码简单,节约内存 使用new创建 有new就会开辟一个新的小空间,地址值不同不会复用浪费空间 案例:用户登录 遍历字符串 统计字符个数 拼接字符串 字符串反转 金额转换 手机号屏蔽 敏感词替换 使用场景:1.字符串拼接。2、字符串反转 常用方法练习 对称字符串

    2024年02月16日
    浏览(51)
  • String(字符串)

    java.lang.String类代表字符串,Java程序中的所有字符串文字(例如“abc”)都为此类的对象。 字符串的内容是不会发生改变的,它的对象在创建后不能被更改。 String是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。 Java程序中的所有字符串文字都被实为此

    2024年02月13日
    浏览(45)
  • 【string题解 C++】字符串相乘 | 翻转字符串III:翻转单词

    目录 字符串相乘 题面 错误记录 Way1 拆分成“先乘后加” 思路 实现 时空复杂度分析 反思 Way2 用数组 思路 实现 时空复杂度分析 翻转字符串III:翻转字符串中的单词 题面 错误记录 思路1 遍历找单词 实现 思路2 暴力解法 实现 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平

    2024年02月07日
    浏览(59)
  • C# 字符串(String)

    C#基础学习入门系列- C# 字符串(String) C#字符串(String)是一种不可变的序列字符。任何对字符串的操作都会返回一个新的字符串。字符串在C#中是一个引用类型,使用System.String类表示。 字符串可以通过使用双引号或者@符号来创建。双引号用于创建普通字符串 ,例如: @符

    2024年01月21日
    浏览(55)
  • redis—String字符串

    目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表和集合的 元素类型是字符串类型,所以

    2024年02月02日
    浏览(47)
  • 字符串分割(split),将字符串按照指定字符进行分割。split(String regex)和split(String regex, int limit)

    一、 split(String regex) 字符串分割,将字符串按照指定字符进行分割,返回的是一个字符串数组。 原理:参数名称是 regex 表示的是以某个字符串进行字符分割。 实例1:根据空格切割 输出结果: 实例2:根据特殊字符进行“.”分割 输出结果: 二、 split(String regex, int limit) 字符

    2024年02月11日
    浏览(51)
  • Java Base64字符串与String字符串互转方法

    在使用String转Base64和Base64转String上有点小问题,特此记录。 结果: 也是跟上面差不多的思路,将Base64转为byte数组,再转为String

    2024年02月15日
    浏览(55)
  • rust 字符串(String)详解

    rust中的 String ,是一个非常常用的 crate ,它的底层涉及到了rust中的所有权概念,不过这不是本章的内容,如果对rust所有权概念感兴趣的,可以查看另一篇文章:rust所有权 本文的目的还是介绍 String 的基本用法,以及有哪些常用的函数可以使用 字符串,也就是由一系列字符

    2024年02月03日
    浏览(44)
  • 6.string字符串的比较

    比较结果是真或假, 比较:字符串是1和1比较 然后9和2 比较 大后面就不用比了 对应字符比他大就行了。 结果:如果这个是符合比较运算符的就返回真。反之假 跟具不同的目的选择不同的运算符, 结果只有真和假,运算符不是最后的结果。 总结:如果这个是符合比较运算符

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包