9.1反射

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

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

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

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

  • reflect.Type类型
  • reflect.Value值

获取到Type和Value的函数

  • reflect.TypeOf(interface{})返回type
  • reflect.ValueOf(interface{})返回值Value

 (1)获取变量属性和值

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "reflect"
  7. )
  8.  
  9. func main() {
  10. a := 1.5
  11. fmt.Println(reflect.TypeOf(a)) //float64
  12. fmt.Println(reflect.ValueOf(a)) //1.5
  13. }

 (2)获取结构体属性的值

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "reflect"
  7. )
  8.  
  9. type People struct {
  10. name string
  11. address string
  12. }
  13. func main() {
  14. peo := People{"derek","guangdong"}
  15. v := reflect.ValueOf(peo)
  16. //有多少个字段
  17. fmt.Println(v.NumField()) //2
  18. //根据索引获取字段值
  19. fmt.Println(v.FieldByIndex([]int {0})) //derek
  20.  
  21. content := "address"
  22. fmt.Println(v.FieldByName(content)) //guangdong
  23. }

 (3)设置结构体属性的值

反射时获取peo的地址,Elem()获取指针指向地址的封装

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "reflect"
  7. )
  8.  
  9. type People struct {
  10. Name string
  11. Address string
  12. }
  13. func main() {
  14. content := "Name"
  15. peo := new(People)
  16. //Elem()获取指针对应元素的值
  17. v := reflect.ValueOf(peo).Elem()
  18. //CanSet():判断值有没有被设置,有设置:True,没有设置:false
  19. fmt.Println(v.FieldByName(content).CanSet())
  20.  
  21. //需要修改属性的内容时,要求结构体中属性名首字母大写才可以设置
  22. v.FieldByName(content).SetString("alice")
  23. v.FieldByName("Address").SetString("beijing")
  24. fmt.Println(peo) //&{alice beijing}
  25. }

 (4)结构体支持标记(tag),标记通常都是通过反射技术获取到 

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "reflect"
  7. )
  8.  
  9. type People struct {
  10. Name string `xml:"name"`
  11. Address string
  12. }
  13. func main() {
  14. t := reflect.TypeOf(People{})
  15. fmt.Println(t.FieldByName("Name")) //{Name string xml:"name" 0 [0] false} true
  16. name,_ := t.FieldByName("Name")
  17. fmt.Println(name.Tag) //xml:"name"
  18. fmt.Println(name.Tag.Get("xml")) //name
  19. }

9.2.日志

有三种级别日志输出

  • Print() 输出日志信息
  • Panic()打印日志信息,并处罚panic,日志信息为Panic信息
  • Fatal()打印日志信息后调用os.Exit(0)

所有日志信息打印时都带有时间,且颜色为红色,输出日志信息到文件中

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "log"
  6. "os"
  7. )
  8.  
  9. func main() {
  10. f,_ := os.OpenFile("D:/golog.log",os.O_APPEND|os.O_CREATE,0777)
  11. logger := log.New(f,"[Info]",log.Ltime) //"[Info]":prefix string
  12. logger.Println("打印日志信息") //[Info]22:13:59 打印日志信息
  13. }

9.3.线程休眠和延迟执行

(1)线程休眠 

Go语言中main()函数为主线程(协程),程序是从上向下执行的

可以通过time包下的Sleep(n)让程序阻塞多少纳秒

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. fmt.Println("111")
  11. time.Sleep(2e9) //2e9 相当于2秒
  12. fmt.Println("222")
  13. }

(2)延迟执行

延迟指定时间后执行一次,但是需要注意在触发时程序没有结束

  1. //Learn_Go/main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. fmt.Println("程序开始")
  11. time.AfterFunc(3e9, func() {
  12. fmt.Println("延迟执行")
  13. })
  14. time.Sleep(4e9) //必须阻塞4s,要不主程序执行完直接退出,不会执行“延迟执行”的代码
  15. fmt.Println("程序结束")
  16. }

  

9.Go-反射、日志和线程休眠的更多相关文章

  1. Android中使用ListView实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  2. Java多线程系列--“基础篇”07之 线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  3. java多线程系类:基础篇:07线程休眠

    概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...

  4. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  5. [Swift]两种线程休眠的方式

    一.线程休眠方式1 [Swift]与[C#]的比较: //C#:需要添加using System.Threading; //线程休眠3000毫秒,即3秒 Thread.Sleep(); //Swift ...

  6. Java多线程(七)——线程休眠

    一.sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线程 ...

  7. 在swift中使用线程休眠

    C#和php都有sleep让线程休眠指定时间后再继续执行后面的代码,swift中应该如何呢?首先,找一下objective-c版本是怎么做的 [self performSelector:@select ...

  8. java笔记--线程休眠sleep()的运用

    线程休眠sleep()方法的运用 在多线程编程中,有时需要让某个线程优先执行.除了可以设置这个线程的优先级为最高外,更加理想的方法是休眠其他线程,若有线程中断了正在休眠的线程,则抛出Interrupt ...

  9. java 多线程系列基础篇(七)之线程休眠

    1. sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线 ...

随机推荐

  1. HttpClient基本功能的使用 Get方式

    一.GET 方法     使用 HttpClient 需要以下 6 个步骤:     1. 创建 HttpClient 的实例     2. 创建某种连接方法的实例,在这里是 GetMethod.在 ...

  2. .NET Core 3.1 Preview 1 发布

    今天,我们正式发布 .NET Core 3.1 Preview 1..NET Core 3.1将是一个小版本,着重于Blazor和Windows桌面开发的功能改进,同时这也是.NET Core 3.0 ...

  3. 使用rsync基于ssh免密登陆进行备份或目录同步

    日常工作中有很多的备份工作,rsync是一个很不错的工具,尝试使用基于ssh免密登陆的方式进行备份,测试成功,是可行且方便的方法,撰文记之,以备后用: 1.A主机root用户对B主机root用户做ss ...

  4. 解决root用户下都无权限操作的问题

    问题现象: 有时系统设置了一种文件,无法编辑其所有权​ sudo chown users:username {filename} 或者root用户下执行 chown users:username {f ...

  5. 【CF933E】A Preponderant Reunion(动态规划)

    [CF933E]A Preponderant Reunion(动态规划) 题面 CF 洛谷 题解 直接做很不好搞,我们把条件放宽,我们每次可以选择两个相邻的非零数让他们减少任意值,甚至可以减成负数(虽 ...

  6. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失问题分析

    最近spring boot项目中由于使用了spring cloud 的hystrix 导致了threadLocal中数据丢失,其实具体也没有使用hystrix,但是显示的把他打开了,导致了此问题. 导 ...

  7. OpenGL光照1:颜色和基础光照

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  8. IDEA maven设置配置

    IDEA Maven配置 1. 下载maven 下载地址 从官网上,下载一个压缩包,然后解压到任意的文件夹 Maven的安装必须需要jdk1.7+ 2. 环境变量设置 M2_HOME改为具体的路径,其 ...

  9. Java生鲜电商平台-电商会员体系系统的架构设计与源码解析

    Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...

  10. react聊天室|react+redux仿微信聊天IM实例|react仿微信界面

    一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...