golang中使用匿名结构体的方法

 更新时间:2022年08月23日 08:42:52   作者:杨彦星  
这篇文章主要介绍了golang中使用匿名结构体,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在一些项目中, 我们会使用json 来将字符串转为结构体,但是很多时候,这种结构体只会用一次,基本上只会用于反序列化, 对于这种只用到一次的结构体, 我们可以使用匿名结构体. 在gin 接收参数的时候会非常有用, 如我们将要接收的json 参数为

{
  "opt": "left", 
  "phoneinfo": [
    {"device_id": 64, "sn": "192.168.110.65:5555"},
    {"device_id": 68, "sn": "192.168.110.164:5555"}
  ]
}

当我们尝试使用 json.Unmarshal() 函数将json 字符串转为go中的数据结构时,我们可以有以下几种方式

转化为map

map 结构需要定义key 和value的类型, 对于key 好说, 可以都定义为string, 但是对于value, 从上面的json 结构可以看出, 有字符串,也有整型,这种就不太好定义,谁知道未来会不会有新的类型,所以我们可以无脑的将json 转化为 map[string]interface{}

import (
	"encoding/json"
	"fmt"
)

func main() {
	str := `{
		"opt": "left", 
		"phoneinfo": [
			{"device_id": 64, "sn": "192.168.110.65:5555"},
			{"device_id": 68, "sn": "192.168.110.164:5555"}
			]
		}`
	var s map[string]interface{}
	
	json.Unmarshal([]byte(str), &s)
	fmt.Printf("%#v", s)
}

这种是可以转换,但是如果要用到里面的数据就比较麻烦, 需要将 interface{} 做类型转换 如要获取到opt 参数

opt := s["opt"].(string)
fmt.Println(opt)

定义具名结构体

还有一种方式是定义一个结构体,用来接收参数 如想要接收上面的json 字符串, 可以定义下面的结构体

package main

import (
	"encoding/json"
	"fmt"
)

type phoneinfo struct {
	Device_id int    `json:"device_id"`
	Sn        string `json:"sn"`
}

type params struct {
	Opt       string      `json:"opt"`
	Phoneinfo []phoneinfo `json:"phoneinfo"`
}

func main() {
	str := `{
		"opt": "left", 
		"phoneinfo": [
			{"device_id": 64, "sn": "192.168.110.65:5555"},
			{"device_id": 68, "sn": "192.168.110.164:5555"}
			]
		}`
	var s params
	json.Unmarshal([]byte(str), &s)
	fmt.Printf("%#v\n", s)
	fmt.Println(s.Opt) //left
	fmt.Println(s.Phoneinfo[0].Sn) //192.168.110.65:5555
}

定义匿名结构体

上面定义了两个结构体,但是很明显,这两个结构体只在这里使用一次, 别的地方是不会再用得到的, 所以这时我们也可以使用匿名结构体

func main() {
	str := `{
		"opt": "left", 
		"phoneinfo": [
			{"device_id": 64, "sn": "192.168.110.65:5555"},
			{"device_id": 68, "sn": "192.168.110.164:5555"}
			]
		}`

	var s struct {
		Opt       string `json:"opt"`
		Phoneinfo []struct {
			Device_id int    `json:"device_id"`
			Sn        string `json:"sn"`
		} `json:"phoneinfo"`
	}
	json.Unmarshal([]byte(str), &s)
	fmt.Printf("%#v\n", s)
	fmt.Println(s.Opt)
	fmt.Println(s.Phoneinfo[0].Sn)

}

直接通过 var 变量名 struct {} 来初始化一个匿名结构体变量, 但是如果这种结构需要在多处使用,那还是单独定义一个具名结构体比较好.

到此这篇关于golang中使用匿名结构体的文章就介绍到这了,更多相关golang匿名结构体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang实现微信公众号后台接入的示例代码

    Golang实现微信公众号后台接入的示例代码

    这篇文章主要介绍了Golang实现微信公众号后台接入的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Golang实现gRPC的Proxy的原理解析

    Golang实现gRPC的Proxy的原理解析

    gRPC是Google开始的一个RPC服务框架, 是英文全名为Google Remote Procedure Call的简称,广泛的应用在有RPC场景的业务系统中,这篇文章主要介绍了Golang实现gRPC的Proxy的原理,需要的朋友可以参考下
    2021-09-09
  • 从并发到并行解析Go语言中的sync.WaitGroup

    从并发到并行解析Go语言中的sync.WaitGroup

    Go 语言提供了许多工具和机制来实现并发编程,其中之一就是 sync.WaitGroup。本文就来深入讨论 sync.WaitGroup,探索其工作原理和在实际应用中的使用方法吧
    2023-05-05
  • 一步步教你编写可测试的Go语言代码

    一步步教你编写可测试的Go语言代码

    相信每位编程开发者们应该都知道,Golang作为一门标榜工程化的语言,提供了非常简便、实用的编写单元测试的能力。本文通过Golang源码包中的用法,来学习在实际项目中如何编写可测试的Go代码。有需要的朋友们可以参考借鉴,下面跟着小编一起去学习学习吧。
    2016-11-11
  • Golang使用Gin创建Restful API的实现

    Golang使用Gin创建Restful API的实现

    本文主要介绍了Golang使用Gin创建Restful API的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Go排序算法通用qsort函数使用示例

    Go排序算法通用qsort函数使用示例

    这篇文章主要为大家介绍了Go排序算法通用qsort函数使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • go类型转换及与C的类型转换方式

    go类型转换及与C的类型转换方式

    这篇文章主要介绍了go类型转换及与C的类型转换方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang构建WebSocket服务器和客户端的示例详解

    Golang构建WebSocket服务器和客户端的示例详解

    这篇文章主要为大家详细介绍了如何使用Go语言构建WebSocket服务器和客户端,以实现双向通信,文中的示例代码讲解详细,需要的小伙伴可以参考一下
    2023-11-11
  • 手把手带你走进Go语言之类型转换

    手把手带你走进Go语言之类型转换

    每个函数都可以强制将一个表达式转换成某种特定数据类型,本文给大家介绍了在Go语言中类型转换的具体用法,讲述的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • go语言Timer计时器的用法示例详解

    go语言Timer计时器的用法示例详解

    Go语言的标准库里提供两种类型的计时器Timer和Ticker。这篇文章通过实例代码给大家介绍go语言Timer计时器的用法,代码简单易懂,感兴趣的朋友跟随小编一起看看吧
    2020-05-05

最新评论