Go语言学习教程(十四)

2023-05-16

一、反射介绍

* 在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体

* 当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射.

* 反射还可以用作判断变量类型

* 整个reflect包中最重要的两个类型

    * reflect.Type 类型

    * reflect.Value 值

* 获取到Type和Value的函数

    * reflect.TypeOf(interface{}) 返回Type

    * reflect.ValueOf(interface{}) 返回值Value

* 判断变量类型

   a:=1.5

   fmt.Println(reflect.TypeOf(a))

* 获取结构体属性的值

ype People struct {

   Id   int

   Name string

}

func main() {

   peo := People{1, "张三"}

   //获取peo的值

   v := reflect.ValueOf(peo)

   //获取属性个数,如果v不是结构体类型panic

   fmt.Println(v.NumField())

   //获取第0个属性,id,并转换为int64类型

   fmt.Println(v.Field(0).Int())

   //获取第1个属性,转换换为string类型

   fmt.Println(v.Field(1).String())

   //根据名字获取类型,并把类型名称转换为string类型

   idValue := v.FieldByName("Id")

   fmt.Println(idValue.Kind().String())

}

* 设置结构体属性的值时要传递结构体指针,否者无法获取设置的结构体对象

    * 反射直射结构体属性时,要求属性名首字母必须大写,否则无法设置

package main

import (

   "fmt"

   "reflect"

)

type People struct {

   Id   int

   Name string

}

func main() {

   peo := People{1, "张三"}

   /*

   反射时获取peo的地址.

   Elem()获取指针指向地址的封装.

   地址的值必须调用Elem()才可以继续操作

    */

   v := reflect.ValueOf(&peo).Elem()

   fmt.Println(v.FieldByName("Id").CanSet())

   v.FieldByName("Id").SetInt(123)

   v.FieldByName("Name").SetString("李四")

   fmt.Println(peo)

}

二、XML文件简介

* 英文全称:Extensible Markup Language

* 中文全称:可扩展标记语言

* 用途:

    * 数据存储

    * 数据交互

    * 配置文件

* 优点:

    * 跨平台性

    * 数据工整,易读

* XML文档结构

    * 第一行:XML头,版本和编码

    * 第二行:DTD可选,能够检查XML内容是否满足要求

    * 最外层标签<peoples> 称为元素节点,根节点

    * <people>...<people> 整个标签称为元素节点

    * id=”1” 属性节点

    * 标签中文字:文本节点

* 语法要求

    * 严格区分大小写

    * 标签必须正确嵌套,必须正确关闭

    * 必须有根节点

    * 属性值必须有双引号

    * 注释:<!-- -->

    * 文本节点出现特殊字符,需要使用实体引用替换

三、XML文件内容读取

    * Go语言标准库提供的API

        * 在encoding/xml包下提供了对XML序列化和反序列化的API

        * 使用Unmarshal可以直接把XML字节切片数据转换为结构体

        * 转换时按照特定的转换规则进行转换,且数据类型可以自动转换

    * 代码示例

        * 给定XML文件内容如下

        <?xml version="1.0" encoding="UTF-8" ?>

        <people id="888">

            <name>smallming</name>

            <address>北京海淀</address>

        </people>

        * 新建结构体,装载XML数据

            * 结构体中属性首字母必须大写,否则无法装配

            type People struct {

                XMLName xml.Name `xml:"people"`

                Id      int      `xml:"id,attr"`

                Name    string   `xml:"name"`

                Address string   `xml:"address"`

            }

            func main() {

                peo := new(People)

                b, err := ioutil.ReadFile("demo.xml")

                fmt.Println(string(b))

                fmt.Println("111:", err)

               err = xml.Unmarshal(b, peo)

                fmt.Println("2222", err)

                fmt.Println(peo)

            }

四、XML文件生成

* 生成XML需要encoding/xml包下的Marshal()函数,结合输入流就可以完成xml文件生成

* 在encoding/xml中有常量,常量中是xml文档头

* 使用Marshal()函数生成的[]byte没有格式化

* 使用MarshalIndent()可以对内容进行格式化

    * 第一个参数:结构体对象

    * 第二个参数:每行的前缀

    * 第三个参数:层级缩进内容

type People struct {

    XMLName xml.Name `xml:"people"`

    Id      int      `xml:"id,attr"`

    Name    string   `xml:"name"`

    Address string   `xml:"address"`

}

func main() {

    peo := People{Id: 123, Name: "smallming", Address: "北京海淀"}

    b, _ := xml.MarshalIndent(peo, "", "    ")

    b = append([]byte(xml.Header), b...)

    ioutil.WriteFile("D:/peo.xml", b, 0666)

    fmt.Println("程序结束")

}

五、日志简介

* 使用开发工具时,控制台打印的信息就是日志信息

* 项目最终发布后是没有开发工具的。如果需要记录日志就要把信息输出到文件中,这个功能也是日志的功能

* 在Go语言标准的log包中提供了对日志的支持

* 有三种级别日志输出

    * Print() 输出日志信息

    * Panic() 打印日志信息,并触发panic,日志信息为Panic信息

    * Fatal() 打印日志信息后调用os.Exit(1)

* 所有日志信息打印时都带有时间,且颜色为红色

* 每种级别日志打印都提供了三个函数

    * Println()

    * Print()

    * Printf()

* 日志文件扩展名为log

六、普通日志信息打印

* 直接使用log包调用Println()即可

    log.Println("打印日志信息")

七、Panic日志信息打印

* 执行后输出日志信息,同时也会触发panic

    log.Panicln("打印日志信息")

八、致命日志信息

* 执行日志打印后,程序被终止

    log.Fatal("打印日志信息")

九、打印日志信息到文件中

* Go语言标准库支持输出日志信息到文件中.

    f, _ := os.OpenFile("D:/golog.log", os.O_APPEND|os.O_CREATE, 07777)

    defer f.Close()

    logger := log.New(f, "[info]\t", log.Ltime)

    logger.Println("输出日志信息")

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go语言学习教程(十四) 的相关文章

  • OpenWrt与嵌入式Linux

    OpenWrt与嵌入式Linux 由于要接手学长留下来的一个项目 xff0c 被迫 要学习OpenWrt的配置方法 虽然对于一个five电工来说这事挺莫名其妙的 xff0c 但还是硬着头皮上吧 xff08 我本想拒绝 xff0c 但他给的是
  • ROS学习笔记#3 package.xml解释

    我们都知道在catkin下创建功能包时 会自动生成一些文件 文件夹 其中就有这个package xml 它主要由以下部分组成 描述tag维护tag开源tag依赖tag结尾tag 描述tag span class token operator
  • idea多模块打包

    多模块打包的办法有两个 1 在parent的pom下执行deploy 这样就会自动将父 pom以及子 module都发布到仓库 在模块中添加如下选项 lt distributionManagement gt lt repository gt
  • Linux系统中永久设置GVIM的字体、背景颜色和显示行数等

    在GVIM窗口界面 xff0c 手动改变字体大小 高亮 背景色等之后 xff0c 下次打开依旧是默认配置 因此介绍一种永久设置的方法 xff1a 一 配置命令 set gfn 61 Tlwg Typist 12 colorscheme de
  • ROS安装和MAVROS以及PX4的安装

    只能说怀着沉重的心情 xff0c 本来不想写的 xff0c 但是又还是害怕后续出什么幺蛾子 xff0c 就记录一下 xff0c 希望自己永远没有机会在看这篇文章 文章目录 ROS安装 ubuntu18 04安装melodic 1 Ubunt
  • C#中=>使用

    目录 一 目的 1 1 想知道 xff1a C 中 61 gt 使用 的意思 二 参考 xff1a 1 C 中 61 gt 表示什么意思 xff1a 1 C 中 61 gt 是什么意思 三 注意 四 操作 xff1a 成功 1 总结 2 代
  • UE4如何将虚幻商城资源导入到自己的工程中+保管库的使用

    一 目的 xff1a 1 导入资源到UE4工程里面很多 xff0c 下面介绍一个 一 参考 1 Unreal初级案例 动作游戏入门中 保管库的使用 http www sikiedu com course 514 tasks 总结 xff1a
  • UE4纯C++与Slate开发沙盒游戏:1.项目介绍与资源获取

    目录 一 目的 xff1a 1 以前看教程 xff0c 编写的笔记都是word版本 xff0c 公司现在文档都加密了 xff0c 发现复习的几率很小 xff0c 而且有时候查找起来很是不好找 xff0c 所以将其发布在CSDN上面 xff0
  • 如何写c++简历

    目录 一 目的 xff1a 1 想知道如何写C C 43 43 方面的简历 1 从别人简历哪里了解一下自己的不足 二 参考 1 c 43 43 软件工程师个人简历大全 1 转 xff1a C C 43 43 程序员简历模板 1 C 43 4
  • 解决sentinel key not found (h0007) Unity

    一 目的 1 电脑重做系统后 xff0c 打开Unity项目跳出了sentinel key not found h0007 Unity对话框 二 参考 1 sentinel key not found h0007 Unity https b
  • adb学习:六(成功):adb命令卸载APK文件

    目录 一 目的 1 想知道 xff1a adb命令卸载APK文件 二 参考 1 adb安装和卸载apk的方式 三 注意 1 安装的命令 四 操作 1 完成 xff1a 能实现卸载apk 1 操作 四 操作 2 系统文件不能够卸载 使用adb
  • unity动态修改标准材质自发光(Emission)

    目录 一 目的 1 想知道 xff1a unity动态修改标准材质自发光 xff08 Emission xff09 二 参考 1Unity利用材质自发光实现物体闪烁 三 操作 xff1a 一 xff1a 完成 xff1a 变换材质自发光的数
  • maven导入本地jar包

    最近看 https github com junicorn kira 实现的java的代码 有个库发现没法使用maven安装 https mvnrepository com artifact com bladejava blade kit
  • GitHubDesktop:学习:三:(第一次操作)GitHubDesktop进行创建分支+合并分支:成功

    目录 一 目的 1 想知道 xff1a GitHubDesktop进行创建分支 1 想知道 xff1a GitHubDesktop进行合并分支 二 参考 1 0基础的git教程 xff0c 傻瓜都会用的Github Desktop 三 总结
  • 鱼眼+红外+IMU+VSLAM+SLAM

    一 目的 1 想知道 xff1a 二 参考 1 一分钟详解鱼眼镜头标定基本原理及实现 https mp weixin qq com s VyxoTaYtYPB Bfh3JCXl1A 三 注意 四 操作
  • VSLAM:一:VSLAM小科普

    一 目的 1 想知道 xff1a VSLAM小科普 1 将其转载 xff0c 避免作者删除 xff0c 就没有了 二 参考 1 VSLAM小科普 https zhuanlan zhihu com p 121601875 百度百科 三 注意
  • Unity3D:问题(成功):如何解决:Unity2019新建工程都空白红色感叹号报错

    目录 一 目的 1 如何解决 Unity2019新建工程都空白红色感叹号报错 2 Unity2019好几个版本新建工程都有红色感叹号空白报错 xff0c Unity卸载安装 UnityHUB卸载安装都试过 xff0c 许可证个人的 xff0
  • Unity用UGUI实现省份选择

    参考 Unity3D中使用UGUI实现省市选择器 YOLO TO GAME的博客 CSDN博客

随机推荐

  • Unity3D中Resources动态加载图片

    问题 xff1a unity的Resources动态加载就不必多说了 xff0c 这里出现的问题是当我把图片放入Resources文件夹后 xff0c 使用Resources Load xff08 datapath xff09 却并没有出现
  • Navicat报错:1045-Access denied for user root@localhost(using password:YES)

    解决 xff1a Navicat报错 xff1a 1045 Access denied for user root 64 localhost using password YES SET PASSWORD FOR 39 root 39 64
  • UE4添加音乐、音效

    目录 一 目的 xff1a 1 想 xff1a UE4添加音乐 音效 二 参考 1 三 操作 xff1a 完成 1 前述 xff1a 1 导入音乐 1 创建Cue 1 Cue进行设置 1 创建音乐 1 播放和暂停音乐 一 目的 xff1a
  • 《嵌入式C语言自我修养》书评

    首先 xff0c 介绍本书的内容 笔者从嵌入式工程师的视角出发 xff0c 先为我们初学者补上硬件相关基础 xff0c 如计算机工作原理和系统结构 xff08 理解程序编译 链接 安装和运行机制 xff09 CPU的工作原理 xff08 理
  • SLAM14讲之第五讲--像素坐标系、畸变、双目相机深度求解

    像素坐标系 由相似三角形的定义可得 xff1a 这是相对于成像平面的坐标变化 xff0c 我们实际上所得到的图片还要经历一层成像平面到像素平面的变换 xff0c 实际上就是相差了一个缩放和原点的平移 如此我们定义 xff1a u为横轴向右与
  • python webkit 异步抓取页面数据

    usr bin python from ghost import Ghost class FetcherCartoon def getCartoonUrl self url if url is None return false todo
  • 树莓派 Ubuntu mate 16.04使用VNC开启远程桌面

    1 安装 vncserver sudo apt span class token operator span get span class token operator span y install vnc4server 2 启动 vncs
  • 数学建模(四)-----最优化问题-----Simulate Anneal Arithmetic

    模拟退火算法的应用很广泛 xff0c 可以较高的效率求解最大截问题 Max Cut Problem 0 1背包问题 Zero One Knapsack Problem 图着色问题 Graph Colouring Problem 调度问题 S
  • 路径规划的优化

    因为这个求N个点的最短路径是将把所有可能的走法都可能尝试一遍 这样的话 如果计算十几个点之间的最短路径是没有问题的 但是问题就在如果超过二十个点位 那么最坏的情况就是需要计算20的阶乘个 这个计算是相当高的 可能会把线上的服务器打爆 或者计
  • SPL06电容式压力传感器数据读取与处理(基于STM32)

    该例程使用的开发板为正点原子的精英板F103 xff0c 相关资料请大家自行去正点原子论坛下载 首先来看一下SPL06的简介 xff0c SPL06的压强测量范围30kPa 110kPa xff0c 最大供电电压为3 6V xff0c 相对
  • 企业微信开发实战(六、自建应用-审批流程引擎之配置可信任域名、创建审批模版、发起审批)

    文章目录 4 自建应用审批状态变化通知回调4 1概述4 2代码实战 5 查询自建应用审批单当前状态5 1概述5 2代码实战 源码赞赏 4 自建应用审批状态变化通知回调 4 1概述 1 企业可以在管理后台 自建应用 设置API接收中 xff0
  • FreeRTOS内存管理之heap_4.c

    FreeRTOS内存管理之heap 4 c源码解析 每当创建任务 队列 互斥量 软件定时器 信号量或事件组时 xff0c RTOS内核会为它们分配RAM 标准函数库中的malloc 和free 函数有些时候能够用于完成这个任务 xff0c
  • git图形化管理工具

    一 独立客户端工具 1 GitHub for Desktop 全球开发人员交友俱乐部提供的强大工具 xff0c 功能完善 xff0c 使用方便 对于使用GitHub的开发人员来说是非常便捷的工具 界面干净 xff0c 用起来非常顺手 xff
  • ROS功能包

    ROS package介绍 package是什么呢 xff1f 指的是一种特定的文件结构和文件夹组合 通常将实现同一个具体功能的程序代码放到一个package中 xff0c 比如实现相机数据采集这一功能 文件结构 CMakeLists tx
  • 坐标转换tf

    tf介绍 坐标转换 TransForm 位置和姿态 坐标变换是空间实体的位置描述 xff0c 是从一种坐标系统变换到另一种坐标系统的过程 通过建立两个坐标系统之间一一对应关系来实现下图为机器人几个部件之间的坐标关系 tf概念 tf是一个用户
  • 经典Windows编程书单

    说好的这次写一个图形编程书单 但是看起来不是很好整理 xff0c 这类书散落的家里到处都是 先把经典Windows编程的书整理一下吧 xff0c 不过Windows的也到处都是很多都找不到了 xff0c 只能把找到的拍个照 xff0c 可能
  • vscode设置C++代码格式化(Clang-Format)

    vscode中只要安装了C C 43 43 扩展后 xff0c 在C C 43 43 源文件中右键就能看到格式化文档的选项 xff0c 这样就能通过该选项或者其快捷键 xff08 Shift 43 Alt 43 F xff09 来实现快速格
  • git pull覆盖了本地未push的代码解决方案

    一 问题背景 情况 xff1a 本地代码写完后 xff0c git push上去github xff0c 然后报错 xff0c 提示要先git pull pull之后 xff0c 失败了或者覆盖了本地未push的代码 二 解决方案 2 1
  • FreeRTOS任务调度原理

    1 FreeRTOS的列表和列表项 列表和列表项是FreeRTOS中一个非常重要的数据结构 xff0c 是FreeRTOS的基石 要想看懂FreeRTOS的源码并学习其中的原理 xff0c 我们必须先了解一下这个数据结构 这个数据结构也是和
  • Go语言学习教程(十四)

    一 反射介绍 在Go语言标准库中reflect包提供了运行时反射 程序运行过程中动态操作结构体 当变量存储结构体属性名称 想要对结构体这个属性赋值或查看时 就可以使用反射 反射还可以用作判断变量类型 整个reflect包中最重要的两个类型