非零基础自学Golang 第9章 结构体 9.7 匿名结构体 9.8 小结 9.9 知识拓展

news2024/9/22 7:20:50

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第9章 结构体
        • 9.7 匿名结构体
          • 9.7.1 匿名结构体定义与初始化
          • 9.7.2 匿名结构体的应用
        • 9.8 小结
        • 9.9 知识拓展
          • 9.9.1 使用结构体解析XML文件

第9章 结构体

9.7 匿名结构体

9.7.1 匿名结构体定义与初始化

匿名结构体,顾名思义,即没有名字的结构体,与匿名函数类似。

匿名结构体无须type关键字就可以直接使用,匿名结构体在创建的同时也要创建对象。

匿名结构体的初始化和使用更加简单,无须通过type关键字定义,且不用写出类型名称。

匿名结构体在初始化时需进行匿名结构体定义和成员变量初始化(可选),格式如下:

title: Go语言
结构体实例 := struct{
 	//匿名结构体定义
 	成员变量1 类型1
 	成员变量2 类型2
 	成员变量3 类型3
 	...
}{
 	//成员变量初始化(可选)
 	成员变量1:值1,
 	成员变量2:值2,
 	成员变量3:值3,
 	...
}

[ 动手写9.7.1]

package main

import "fmt"

type Book struct {
   title  string
   author string
   num    int
   id     int
}

func main() {

   book1 := struct {
      title  string
      author string
      num    int
      id     int
   }{
      title:  "Go语言",
      author: "Tom",
      num:    20,
      id:     152368,
   }

   fmt.Println("title: ", book1.title)
   fmt.Println("author: ", book1.author)
   fmt.Println("num: ", book1.num)
   fmt.Println("id: ", book1.id)
}

运行结果

在这里插入图片描述

如果需要初始化多个不同的实例(书),那么会存在大量重复的代码。

所以,实际开发过程中,不建议通过这种方式来使用结构体。

9.7.2 匿名结构体的应用

匿名结构体一般可用于组织全局变量、构建数据模板和解析JSON等。

例如,我们可以通过自定义匿名结构体将同一类的全局变量组织在一起。

var config struct {
 	IP string
 	Port int
}
config.IP = "192.168.1.1"
config.Port = 8080

另外,我们经常会使用匿名结构体来临时存储经过解析后的JSON数据:

[ 动手写 9.7.2]

package main

import (
	"encoding/json"
	"fmt"
)

func main() {

	data := &struct {
		Code int
		Msg  string
	}{}

	jsonData := `{"code":200 ,"msg":""}`

	if err := json.Unmarshal([]byte(jsonData), data); err != nil {
		fmt.Println(err)
	}

	fmt.Println("code: ", data.Code)
	fmt.Println("msg: ", data.Msg)
}

运行结果

在这里插入图片描述

在以上例子中,由于json包的Unmarshal函数的第二个参数为JSON解析后传递的对象,因此必须传入对象引用而非值传递。

9.8 小结

  • Go语言的结构体是一种对现实生活中实体的抽象,结构体由一系列成员变量构成,这些成
    员变量对应着实体不同的属性。

  • 定义结构体后,需要对结构体进行实例化才能使用结构体的字段。

    Go语言实例化结构体主要有:

    • 标准实例化
    • new函数实例化
    • 取地址实例化三种方式。
  • Go语言中可以通过键值对格式和列表格式对结构体进行初始化。

9.9 知识拓展

9.9.1 使用结构体解析XML文件

XML即可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

在计算机中,标记指计算机所能理解的信息符号,通过此类标记,计算机之间可以处理包含各种信息的文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。它是网络环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。

早在1998年,W3C就发布了XML 1.0规范,用来简化网络间的文档信息传输。

当然现在是 Json 独大了

XML本质上是一种树形的数据格式,我们可以定义与之匹配的Go语言的struct类型,然后通过xml包对XML文件中的数据进行解析,存储到自定义的结构体中。

我们先创建test.xml文件,文件内容如下,用于进行解析:

<?xml version="1.0" encoding="UTF-8" ?>
<Persons>
    <Person>
        <Name>小丁</Name>
        <Age>23</Age>
        <Interests>
            <Interest>看书</Interest>
            <Interest>打游戏</Interest>
        </Interests>
    </Person>

    <Person>
        <Name>凤凤</Name>
        <Age>22</Age>
        <Interests>
            <Interest>姜云升</Interest>
            <Interest>吃零食</Interest>
        </Interests>
    </Person>
</Persons>

根据XML文件中的内容,自定义结构体如下。必须注意的是,解析的时候,tag、字段名、XML元素都是对大小写敏感的,所以必须一一对应字段。

type Result struct {
	Person []Person
}

type Person struct {
	Name string
 	Age string
 	Interests Interests
}

type Interests struct {
 	Interest []string
}

使用ioutil包中的ReadFile方法,将源代码所在目录下的test.xml文件内容读入content变量,类型为字节数组类型:

content, err := ioutil.ReadFile("test.xml")

之后使用xml包中的Unmarshal方法解析XML文件内容:

err = xml.Unmarshal(content, res)

程序源代码如下,最后打印所解析的XML文件内容:

[ 动手写 9.9.1]

package main

import (
   "encoding/xml"
   "fmt"
   "io/ioutil"
)

type Result struct {
   Person []Person
}

type Person struct {
   Name      string
   Age       string
   Interests Interests
}

type Interests struct {
   Interest []string
}

func main() {

   var res Result
   content, err := ioutil.ReadFile("test.xml")

   if err != nil {
      fmt.Println(err)
      return
   }

   err = xml.Unmarshal(content, &res)
   if err != nil {
      fmt.Println(err)
   }

   fmt.Println("XML文件解析后的内容为: ")
   fmt.Println(res)
}

其实ioutil.ReadFile 这玩意儿已经弃用了

【今天是 2022 年12 月 4 日】

看看官方API 文档

https://pkg.go.dev/io/ioutil

在这里插入图片描述

在这里插入图片描述

果然是已经弃用了

在这里插入图片描述

在这里插入图片描述

看到可以换成OS

试试

package main

import (
	"encoding/xml"
	"fmt"
	"os"
)

type Result struct {
	Person []Person
}

type Person struct {
	Name      string
	Age       string
	Interests Interests
}

type Interests struct {
	Interest []string
}

func main() {

	var res Result
	content, err := os.ReadFile("第9章结构体/知识拓展/test.xml")

	if err != nil {
		fmt.Println(err)
		return
	}

	err = xml.Unmarshal(content, &res)
	if err != nil {
		fmt.Println(err)
	}

	fmt.Println("XML文件解析后的内容为: ")
	fmt.Println(res)
}

运行结果

在这里插入图片描述

OK

Go语言中是利用反射机制将来自XML文件中的数据反射成对应的struct对象的,其中缺少的元素或空属性值将被解析为零值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

blender源代码编译运行

其实在blender官网上已经给出了编译步骤https://wiki.blender.org/wiki/Building_Blender/Windows&#xff0c;由于在源码编译的过程中还遇到了很多问题&#xff0c;特此记录一下。 文章目录前提准备代码下载1. blender源码下载2. lib下载编译前提准备 Visual Studio2019或者2…

Innodb存储引擎-执行流程分析和二阶段提交分析

文章目录执行流程分析基本流程WAL(Write-Ahead Log)write和fsync区别innodb_flush_logs_at_trx_commit & sync_binlog二阶段提交执行流程分析 基本流程 &#xff08;1&#xff09;连接,分析,优化,执行 客户端与MySQL Server建立连接&#xff0c;发送语句给MySQL Server&a…

2022.12.18 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.RNNConventional Recurrent Neural Networks5.Deep Recurrent Neural Networks5.1 Deep Transition RNN5.2 Deep Output5.3 Stacked RNN6.实验6.1 训练6.2 结果与分析7.讨论深度学习GRU公式推导1.GRU前向传播2.GRU反向传播GRU代码实现…

关于数学中“函数(function)”的含义

目录 1. 问题 2. “function”是如何翻译成“函数”的&#xff1f; 3. “function”是谁引入数学中的&#xff0c;其意义何在&#xff1f; 3.1 “function”的词源 3.2 “function”引入数学中 3.3 “function”的含义 4. 常见的函数(Common Functions) 4.1 线性函数(L…

word页码如何设置为章节加页码,例如第一章第一页1-1、第二章章第一页2-1

由于用到word页码分章节页码的形式&#xff0c;从网上查了一下&#xff0c;质量真的很差&#xff0c;没有一篇文章讲清楚的&#xff0c;有的所答非所问&#xff0c;一怒之下&#xff0c;利用几个小时的时间解决问题并写下这篇文章&#xff0c;以供大家学习参考&#xff01;&…

【JSP】

文章目录简介Scriptlet脚本小程序JSP的指令标签include静态包含include动态包含不传参传参JSP的四大域对象四种属性范围验证属性范围的特点EL表达式操作字符串操作集合emptyJSTL条件动作标签if标签choose、when 和 otherwise 标签迭代标签foreach格式化动作标签formatNumber标签…

NProgress 进度条的使用方法

安装NProgress 进度条 npm install nprogress --save-dev 在vue项目中mian.js中或router.js或axios.js&#xff1a; import NProgress from nprogress import nprogress/nprogress.css 使用NProgress进度条 NProgress.start(); &#xff1a;进度条开始&#xff1b; NProgr…

GCD和LCM

目录 一 整除 定义 性质 二 GCD 1&#xff09;定义 2&#xff09;性质 3&#xff09;GCD编程 ①暴力法 ②欧几里得算法 ③更相减损术 ④Stein算法 三 LCM ①暴力法 ②最大公约数法 四 裴蜀定理 例题&#xff1a;裴蜀定理 一 整除 定义 a 能整除b,记为 a|b。其…

你还会想起这道题吗

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 原神是由米哈游自主研发的一款全新开放世界冒险游戏。游戏发生在一个被称作「提瓦特」的幻想世界&#xff0c;在这里&#xff0c;被神选中的人将被授予「神之眼」&#xff0c;导引元…

m基于神经网络的气候预测matlab仿真,气候数据采用的BoM气候数据,神经网络为matlab编程实现不使用工具箱函数

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工神经网络&#xff08;Artificial Neural Networks&#xff0c;简写为ANNs&#xff09;也简称为神经网络&#xff08;NNs&#xff09;或称作连接模型&#xff08;Connection Model&#xff09…

UICollectionView 实际使用

一. 使用UICollectionView制作书架 我想的书架是那种每一排都可以滑动的。暂时的想法是使用两个collectionView&#xff0c;第一个collectionView布置书架的每一排&#xff0c;第二个布置每一排内部的书。 布置外部的colletionView&#xff0c;这部分很简单&#xff0c;item的…

[ 数据结构 -- 手撕排序算法第五篇 ] 堆排序

文章目录前言一、常见的排序算法二、堆的概念及结构三、堆的实现3.1 堆的插入3.2 堆的删除四、堆排序4.1 向上调整建堆4.2 向下调整建堆4.3 建堆的时间复杂度4.4 堆排序五、堆排序的特性前言 手撕排序算法第五篇&#xff1a;堆排序&#xff01; 从本篇文章开始&#xff0c;我会…

Java+JSP超市管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术后台框架&#xff1a;Servlet、JSP、JDBC、UI界面&#xff1a;BootStrap、jQuery、数据库&#xff1a;MySQL 系统功能 该系统共包含两种角色&#xff1a;员工和管理员。系统的主要功能模块如下&#xff1a; 1.系统管理 系统登陆、系统退出、修改…

《Mysql是怎样运行的》补充

19 第19章 从猫爷被杀说起-事务简介 19.1 事务的起源 19.1.1 原子性&#xff08;Atomicity&#xff09; 19.1.2 隔离性&#xff08;Isolation&#xff09; 其它的状态转换不会影响到本次状态转换&#xff0c;这个规则被称之为 隔离性 19.1.3 一致性&#xff08;Consisten…

[ISITDTU 2019]EasyPHP rce替换字母

<?php highlight_file(__FILE__);$_ $_GET[_]; if ( preg_match(/[\x00- 0-9\"$&.,|[{_defgops\x7F]/i, $_) )die(ros will not do it);if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )die(you are so close, omg);eval($_); ?> 打开界面有两个i…

Mysql分布式锁(四)乐观锁实现并发

文章目录CAS - Compare And Swap业务改造1. 表结构新增version列2. 修改代码3. 测试问题1. 高并发情况下&#xff0c;性能极低2. ABA问题3. 读写分离情况下导致乐观锁不可靠CAS - Compare And Swap 先比较再交换&#xff0c;一般通过时间戳或者version版本号。 举例&#xff1…

【审计思路】如何快速定位SQLMS注入漏洞?

0x00 前言 MCMS是政府、教育等其他行业常用的CMS&#xff0c;应用广泛&#xff0c;但是底层的代码中仍然遗留不少的问题。这篇文章主要针对SQL注入进行审计并探讨如何快速定位SQL注入漏洞&#xff0c;以及其他工具的应用。 MCMS&#xff0c;是完整开源的Java CMS&#xff01;基…

[ vulhub漏洞复现篇 ] Apache Airflow Celery 消息中间件命令执行漏洞复现 CVE-2020-11981

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

基于asp.net企业网上办公自动化系统-计算机毕业设计

企业网上办公自动化通过对各办公自动化要素的闭环整合&#xff0c;实现了工作流、信息流、知识流和办公自动化系统的整合管理&#xff0c;提供了一个科学、开放、先进的信息化办公平台&#xff0c;实现办公自动化&#xff0c;并进行远程办公或在家办公。企业网上办公自动化将人…

redis开启二级缓存

目录 1. redis集成 2. pom.xml加入redis缓存支持 3. 在项目配置文件中加入cache配置 4. 在启动类开发缓存功能 5. 需要缓存的实体对象实现序列化接口 6. 缓存的使用 7. 测试 今天与大家分享&#xff0c;redis二级缓存实现案例。如有问题&#xff0c;望指教。 1. redis集…