9.Go-反射、日志和线程休眠
9.1反射
在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体
当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射
反射还可以用作判断变量类型
整个reflect包中最重要的两个类型
- reflect.Type类型
- reflect.Value值
获取到Type和Value的函数
- reflect.TypeOf(interface{})返回type
- reflect.ValueOf(interface{})返回值Value
(1)获取变量属性和值
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "reflect"
- )
- func main() {
- a := 1.5
- fmt.Println(reflect.TypeOf(a)) //float64
- fmt.Println(reflect.ValueOf(a)) //1.5
- }
(2)获取结构体属性的值
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "reflect"
- )
- type People struct {
- name string
- address string
- }
- func main() {
- peo := People{"derek","guangdong"}
- v := reflect.ValueOf(peo)
- //有多少个字段
- fmt.Println(v.NumField()) //2
- //根据索引获取字段值
- fmt.Println(v.FieldByIndex([]int {0})) //derek
- content := "address"
- fmt.Println(v.FieldByName(content)) //guangdong
- }
(3)设置结构体属性的值
反射时获取peo的地址,Elem()获取指针指向地址的封装
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "reflect"
- )
- type People struct {
- Name string
- Address string
- }
- func main() {
- content := "Name"
- peo := new(People)
- //Elem()获取指针对应元素的值
- v := reflect.ValueOf(peo).Elem()
- //CanSet():判断值有没有被设置,有设置:True,没有设置:false
- fmt.Println(v.FieldByName(content).CanSet())
- //需要修改属性的内容时,要求结构体中属性名首字母大写才可以设置
- v.FieldByName(content).SetString("alice")
- v.FieldByName("Address").SetString("beijing")
- fmt.Println(peo) //&{alice beijing}
- }
(4)结构体支持标记(tag),标记通常都是通过反射技术获取到
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "reflect"
- )
- type People struct {
- Name string `xml:"name"`
- Address string
- }
- func main() {
- t := reflect.TypeOf(People{})
- fmt.Println(t.FieldByName("Name")) //{Name string xml:"name" 0 [0] false} true
- name,_ := t.FieldByName("Name")
- fmt.Println(name.Tag) //xml:"name"
- fmt.Println(name.Tag.Get("xml")) //name
- }
9.2.日志
有三种级别日志输出
- Print() 输出日志信息
- Panic()打印日志信息,并处罚panic,日志信息为Panic信息
- Fatal()打印日志信息后调用os.Exit(0)
所有日志信息打印时都带有时间,且颜色为红色,输出日志信息到文件中
- //Learn_Go/main.go
- package main
- import (
- "log"
- "os"
- )
- func main() {
- f,_ := os.OpenFile("D:/golog.log",os.O_APPEND|os.O_CREATE,0777)
- logger := log.New(f,"[Info]",log.Ltime) //"[Info]":prefix string
- logger.Println("打印日志信息") //[Info]22:13:59 打印日志信息
- }
9.3.线程休眠和延迟执行
(1)线程休眠
Go语言中main()函数为主线程(协程),程序是从上向下执行的
可以通过time包下的Sleep(n)让程序阻塞多少纳秒
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "time"
- )
- func main() {
- fmt.Println("111")
- time.Sleep(2e9) //2e9 相当于2秒
- fmt.Println("222")
- }
(2)延迟执行
延迟指定时间后执行一次,但是需要注意在触发时程序没有结束
- //Learn_Go/main.go
- package main
- import (
- "fmt"
- "time"
- )
- func main() {
- fmt.Println("程序开始")
- time.AfterFunc(3e9, func() {
- fmt.Println("延迟执行")
- })
- time.Sleep(4e9) //必须阻塞4s,要不主程序执行完直接退出,不会执行“延迟执行”的代码
- fmt.Println("程序结束")
- }
9.Go-反射、日志和线程休眠的更多相关文章
- Android中使用ListView实现分页刷新(线程休眠模拟)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- Java多线程系列--“基础篇”07之 线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- java多线程系类:基础篇:07线程休眠
概要 本章,会对Thread中sleep()方法进行介绍.涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http:// ...
- Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...
- [Swift]两种线程休眠的方式
一.线程休眠方式1 [Swift]与[C#]的比较: //C#:需要添加using System.Threading; //线程休眠3000毫秒,即3秒 Thread.Sleep(); //Swift ...
- Java多线程(七)——线程休眠
一.sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线程 ...
- 在swift中使用线程休眠
C#和php都有sleep让线程休眠指定时间后再继续执行后面的代码,swift中应该如何呢?首先,找一下objective-c版本是怎么做的 [self performSelector:@select ...
- java笔记--线程休眠sleep()的运用
线程休眠sleep()方法的运用 在多线程编程中,有时需要让某个线程优先执行.除了可以设置这个线程的优先级为最高外,更加理想的方法是休眠其他线程,若有线程中断了正在休眠的线程,则抛出Interrupt ...
- java 多线程系列基础篇(七)之线程休眠
1. sleep()介绍 sleep() 定义在Thread.java中.sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”.sleep()会指定休眠时间,线 ...
随机推荐
- HttpClient基本功能的使用 Get方式
一.GET 方法 使用 HttpClient 需要以下 6 个步骤: 1. 创建 HttpClient 的实例 2. 创建某种连接方法的实例,在这里是 GetMethod.在 ...
- .NET Core 3.1 Preview 1 发布
今天,我们正式发布 .NET Core 3.1 Preview 1..NET Core 3.1将是一个小版本,着重于Blazor和Windows桌面开发的功能改进,同时这也是.NET Core 3.0 ...
- 使用rsync基于ssh免密登陆进行备份或目录同步
日常工作中有很多的备份工作,rsync是一个很不错的工具,尝试使用基于ssh免密登陆的方式进行备份,测试成功,是可行且方便的方法,撰文记之,以备后用: 1.A主机root用户对B主机root用户做ss ...
- 解决root用户下都无权限操作的问题
问题现象: 有时系统设置了一种文件,无法编辑其所有权 sudo chown users:username {filename} 或者root用户下执行 chown users:username {f ...
- 【CF933E】A Preponderant Reunion(动态规划)
[CF933E]A Preponderant Reunion(动态规划) 题面 CF 洛谷 题解 直接做很不好搞,我们把条件放宽,我们每次可以选择两个相邻的非零数让他们减少任意值,甚至可以减成负数(虽 ...
- Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失问题分析
最近spring boot项目中由于使用了spring cloud 的hystrix 导致了threadLocal中数据丢失,其实具体也没有使用hystrix,但是显示的把他打开了,导致了此问题. 导 ...
- OpenGL光照1:颜色和基础光照
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- IDEA maven设置配置
IDEA Maven配置 1. 下载maven 下载地址 从官网上,下载一个压缩包,然后解压到任意的文件夹 Maven的安装必须需要jdk1.7+ 2. 环境变量设置 M2_HOME改为具体的路径,其 ...
- Java生鲜电商平台-电商会员体系系统的架构设计与源码解析
Java生鲜电商平台-电商会员体系系统的架构设计与源码解析 说明:Java生鲜电商平台中会员体系作为电商平台的基础设施,重要性不容忽视.我去年整理过生鲜电商中的会员系统,但是比较粗,现在做一个最好的整 ...
- react聊天室|react+redux仿微信聊天IM实例|react仿微信界面
一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...