Golang 实现interface类型转string类型

看代码吧~

// Strval 获取变量的字符串值
// 浮点型 3.0将会转换成字符串3, "3"
// 非数值或字符类型的变量将会被转换成JSON格式字符串
func Strval(value interface{}) string {
	var key string
	if value == nil {
		return key
	}
	switch value.(type) {
	case float64:
		ft := value.(float64)
		key = strconv.FormatFloat(ft, 'f', -1, 64)
	case float32:
		ft := value.(float32)
		key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
	case int:
		it := value.(int)
		key = strconv.Itoa(it)
	case uint:
		it := value.(uint)
		key = strconv.Itoa(int(it))
	case int8:
		it := value.(int8)
		key = strconv.Itoa(int(it))
	case uint8:
		it := value.(uint8)
		key = strconv.Itoa(int(it))
	case int16:
		it := value.(int16)
		key = strconv.Itoa(int(it))
	case uint16:
		it := value.(uint16)
		key = strconv.Itoa(int(it))
	case int32:
		it := value.(int32)
		key = strconv.Itoa(int(it))
	case uint32:
		it := value.(uint32)
		key = strconv.Itoa(int(it))
	case int64:
		it := value.(int64)
		key = strconv.FormatInt(it, 10)
	case uint64:
		it := value.(uint64)
		key = strconv.FormatUint(it, 10)
	case string:
		key = value.(string)
	case []byte:
		key = string(value.([]byte))
	default:
		newValue, _ := json.Marshal(value)
		key = string(newValue)
	}
	return key
}

补充:golang json 为map[string] interface{}

json字符串:

{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0,"w":"还"}]},{"bg":0,"cw":[{"sc":0,"w":"有点"}]},{"bg":0,"cw":[{"sc":0,"w":"眼熟"}]}]}

需要将json格式中的w字段取出来,并且拼成结果串进行展示

1、从json数组中获取ws

2、ws是数组,数组元素为object

3、cw是数组,数组元素为object

4、w是string

5、从cw遍历获取w字段

解析代码:

func RecResultJsonToPlain() {
    var recResult string
    var dat map[string]interface{}
    json.Unmarshal([]byte(json_str), &dat)

    if v, ok := dat["ws"]; ok {
        ws := v.([]interface{})
        for i, wsItem := range ws {
            wsMap := wsItem.(map[string]interface{})
            if vCw, ok := wsMap["cw"]; ok {
                cw := vCw.([]interface{})
                for i, cwItem := range cw {
                    cwItemMap := cwItem.(map[string]interface{})
                    if w, ok := cwItemMap["w"]; ok {
                        recResult = recResult + w.(string)
                    }
                }
            }
        }
    }
    fmt.Println(recResult)
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决golang 反射interface{}做零值判断的一个重大坑

    在对float零值判断时往往只需要和0做==即可,所以曾经int和float都用==0来做对比, 比如下方: in := 0. var tmp interface{} = float32(in) fmt.Println("float 0==0:", in == 0) fmt.Println("float -> interface{} -> float", tmp.(float32) == 0) switch v := tmp.(type) { case

  • 详解用Go语言实现工厂模式(Golang经典编程案例)

    golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题.这个模式本身很简单而且使用在业务较简单的情况下.一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改). 代码结构如下:分别有main.go和student.go两个文件. 在student.go中: package model //定义一个结构体 type student struct{ Name string score float64 } //因为student结构体首字母是小写,因此是只能在mod

  • golang通过反射设置结构体变量的值

    如果需要动态设置struct变量field的情况下, 可以利用reflect来完成. 代码如下: package main import ( "fmt" "reflect" ) // 定义结构体Person type Person struct { Name string Age int } func main() { person := Person{} fmt.Println(person) // 修改前 { 0} pp := reflect.ValueOf(&

  • 深入Golang中的sync.Pool详解

    我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用的机制,也就是sync.Pool对象池. sync.Pool是可伸缩的,并发安全的.其大小仅受限于内存的大小,可以被看作是一个存放可重用对象的值的容器. 设计的目的是存放已经分配的但是暂时不用的对象,在需要用到的时候直接从pool中取. 任何存放区其中的值可以在任何时候被删除而不通知,在高负载下可以动态的扩容,在不活跃时对象池会收缩. sync.Pool首先

  • golang判断key是否在map中的代码

    个人常用函数 func IsContain(items []string, item string) bool { for _, eachItem := range items { if eachItem == item { return true } } return false } 使用方法 var word := "my" var sentence := []string{"my","word","in","a

  • golang 如何获取map所有key的方式

    最佳方式:根据map的长度,新建一个数组,遍历map逐个压入 方法1(效率很高): func getKeys1(m map[int]int) []int { // 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高 j := 0 keys := make([]int, len(m)) for k := range m { keys[j] = k j++ } return keys } 方法2(效率很高): func getKeys2(m map[int]int) [

  • golang interface判断为空nil的实现代码

    要判断interface 空的问题,首先看下其底层实现. interface 底层结构 根据 interface 是否包含有 method,底层实现上用两种 struct 来表示:iface 和 eface.eface表示不含 method 的 interface 结构,或者叫 empty interface. 对于 Golang 中的大部分数据类型都可以抽象出来 _type 结构,同时针对不同的类型还会有一些其他信息. 1.eface type eface struct { _type *_t

  • java Long类型转为String类型的两种方式及区别说明

    目录 java Long类型转为String类型 1.Long.ValueOf("String")返回Long包装类型数据 2.Long.parseLong("String")返回long基本数据类型 Java中Long.String.Date 类型之间的转换 1.Java.util.Date类型转换成long类型 2.long类型转换成java.util.Date类型 3.形如"2015-08-31 21:08:06"等格式化string类型转

  • Golang 实现interface类型转string类型

    看代码吧~ // Strval 获取变量的字符串值 // 浮点型 3.0将会转换成字符串3, "3" // 非数值或字符类型的变量将会被转换成JSON格式字符串 func Strval(value interface{}) string { var key string if value == nil { return key } switch value.(type) { case float64: ft := value.(float64) key = strconv.Format

  • 浅谈golang类型断言,失败类型断言返回值问题

    失败的类型断言,返回的值为最近断言类型的零值 代码入下: func main() { var data interface{} = "ehoo" if res, ok := data.(int); ok { fmt.Printf("int res:%d\n", res) } else if res, ok := data.(bool); ok { fmt.Printf("bool res:%b\n", res) } else { fmt.Prin

  • mybatis 如何返回list<String>类型数据

    mybatis返回list<String>类型数据 studends表里一条teacher_id 数据对应多条 student_id数据,所以通过teacher_id 查询出来的student_id 是一个List. mybatis代码如下: //返回类型是String类型的student_id <resultMap id="studentIdResult" type="java.lang.String" > <result colum

  • 浅谈String类型如何转换为time类型存进数据库

    目录 String转换为time存进数据库 这里就列举一个例子 java里面的类型是string类型 我使用的是java提供的传统的jdbc接口连接数据库 String类型的数字转换为时间日期格式 问题描述 String转换为time存进数据库 很久没试过将String类型转换并存进数据库中的date类型的字段,今天刚好遇到并解决了这个小问题,故写下来加深印象. 平时我们一般将数据库里面关于时间的处理字段设置为char之类的字符型,这样的好处是便于读取和存入,省掉了转换类型的麻烦. 但有时也会需

  • SpringBoot返回对象时,如何将Long类型转换为String

    目录 SpringBoot返回对象将Long类型转换为String 1.自定义ObjectMapper 2.把MappingJackson2HttpMessageConverter 3.定义返回的VO类 4.返回的Long类型id为String类型 Long类型转换为String类型的方法及区别 注意事项 SpringBoot返回对象将Long类型转换为String 1.自定义ObjectMapper /** * 返回Long转换为String * @author Jingly */ publi

  • Golang中interface{}转为数组的操作

    interface{} 转为普通类型 我们都知道在golang中interface{}可以代表任何类型,对于像int64.bool.string等这些简单类型,interface{}类型转为这些简单类型时,直接使用 p, ok := t.(bool) p, ok := t.(int64) 如果ok==true的话,就已经类型转换成功. 假设有这样一个场景,我们有一个函数有返回值,但是返回值的类型不定,所以我们的返回值类型只能以接口来代替了. 返回接口类型之后,我们就要对其类型进行判断然后进行类型

  • golang语言如何将interface转为int, string,slice,struct等类型

    在golang中,interface{}允许接纳任意值,int,string,struct,slice等,因此我可以很简单的将值传递到interface{},例如: package main import ( "fmt" ) type User struct{ Name string } func main() { any := User{ Name: "fidding", } test(any) any2 := "fidding" test(a

  • golang 实现interface{}转其他类型操作

    golang中的string是可以转换为byte数组或者rune数组 但是其实byte对应的类型是uint8,而rune对应的数据类型就是int32 所以string可以转换为四种类型 //interface转其他类型----返回值是interface,直接赋值是无法转化的 //interface 转string var a interface{} var str5 string a = "3432423" str5 = a.(string) fmt.Println(str5) //i

  • GoLang string类型深入分析

    目录 并发不安全 竞态竞争 字符串优化 文章运行环境:go version go1.16.6 darwin/amd64 并发不安全 看下面的代码,大家觉得会输出什么?大多数人应该都会觉得输出"".abc.neoj 这三种情况,但真实的情况并不是这样,真实情况是只输出 “” 空字符串. 结合日常的工作,类似这种并发操作同一个变量的情况也比较常见,为什么业务没有发生异常问题? var name string = "" func main() { go func() {

随机推荐