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()会指定休眠时间,线 ...
随机推荐
- Sphinx 2.0.8 发布,全文搜索引擎 Installing Sphinx on Windows
参考资料地址信息 http://sphinxsearch.com/docs/latest/installing-windows.html http://my.oschina.net/melonol/b ...
- C# 二维数组 转换成 DataTable
C# 数据转换 Overview C# 窗体操作中,有些比较特别的操作.但是为了方便我们不得不使用一些比较特别的手段. C#中二维数组转DataTable 首先,我们看一下我对二维数组的数据处理.这次 ...
- Golang 入门 : channel(通道)
笔者在<Golang 入门 : 竞争条件>一文中介绍了 Golang 并发编程中需要面对的竞争条件.本文我们就介绍如何使用 Golang 提供的 channel(通道) 消除竞争条件. C ...
- Spring的增强模式
一.前置增强 1.IdoSomeService 2.IdoSomeServiceImpl类实现IdoSomeService接口 3.MyBeforeAdvice 实现前置增强方法 4.applicat ...
- 我说精通字符串,面试官竟然问我 Java 中的 String 有没有长度限制?
String 是 Java 中很重要的一个数据类型,除了基本数据类型以外,String 是被使用的最广泛的了,但是,关于 String,其实还是有很多东西容易被忽略的. 就如本文我们要讨论的问题:Ja ...
- antV G2 为柱状图添加背景颜色
工作中需要在基础柱状图的基础上添加一个自定义高度的背景颜色, 基础柱状图: 目标柱状图: 由于chart绘图可以重叠,通过该特性,我们可以在画两次图重叠在一起,第一次绘图描述背景,第二次绘图描述数据, ...
- overflow-x:scroll失效问题解决
在移动设备上设置overflow-x:scroll,大部分机型都是展示正常的,在安卓哦5.0系统上,无论怎么样滚动条都不会生效,终于找到了解决办法: display: -webkit-box; // ...
- git设置github的远程仓库的相关操作
git能够把github作为远程仓库,本地可以进行推送有关变更,从而多人可以进行协作开发工作. 1 ssh-keygen -t rsa -C "your-email@163. ...
- SQL学习_SELECT
查询列: SQL:SELECT name FROM heros 多列查询: SQL:SELECT name, hp_max, mp_max, attack_max, defense_max FROM ...
- 导入部署 hand
差价导入部署步骤如下: 执行视图,包. 定义消息,验证的时候使用(XXC1003DFM_BI_001 到 XXC1003DFM_BI_007,含中英文). 通用导入设置: 电子表元数据管理,含导入正确 ...