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()会指定休眠时间,线 ...
随机推荐
- POJ2001Shortest Prefixes(Trie树)
传送门 题目大意:求最短唯一前缀 题解:Trie树 把单词一个个插入,每个字母节点v[]++;然后输出时输出到v[]为1的点, v[]=1说明只有这个单词经过. 代码 : #include<io ...
- Codeforces Round #598 (Div. 3) B. Minimize the Permutation 贪心
B. Minimize the Permutation You are given a permutation of length n. Recall that the permutation is ...
- electron窗口间通信
以下代码均来自于我开发的开源软件:想学吗 窗口A的渲染进程发消息给主进程 const { clipboard, ipcRenderer, remote } = require('electron'); ...
- HTML连载48-清除浮动的其中两种方式
一.清除浮动的方式一 给前面一个父元素设置高度,注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...
- 查询安装webpack4.0是否成功时提示无法找到的解决方法
最近使用webpack -v 查询webpack版本时提示无法找到 然后我试着重新全局安装webpack,提示还需要安装webpack-cli 选择yes后虽能成功安装webp ...
- PHPexcel导入数据的时候出现object解决方法
打印其他数据都是正常的,就这个是一个对象 从表格里面看不出问题 后面找到原因是表格里那个名字 李珊珊 周围有空白字符,去掉之后就能正常导入, 解决方法: 找到导入文件的那个方法 ...
- VS2019 MSB364 未找到框架“NETFramework,Version=v4.7”
环境: WIN 10 VS2019 已安装框架v4.7.2 问题: 在打开一些早期项目时,编译报 MSB364 错误,未找到框架“NETFramework,Version=v4.7”或未找到框架“NE ...
- 一次业务网关用ASP.NET Core 2.1重构的小结
目录 前言 统一鉴权 服务限流 路由转发 参数重组 链路跟踪 熔断降级 服务计次 业务指标监控 日志记录 迭代更新 总结 前言 对于API网关,业界貌似对它进行下划分,有下面几个分类/场景. 面向We ...
- python基础(22):模块、包
1. 模块 1.1 什么是模块 别人写好的函数.变量.方法放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模 ...
- 并发编程-epoll模型的探索与实践
前言 我们知道nginx的效率非常高,能处理上万级的并发,其之所以高效离不开epoll的支持, epoll是什么呢?,epoll是IO模型中的一种,属于多路复用IO模型; 到这里你应该想到了,sele ...