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-反射、日志和线程休眠的更多相关文章

  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. python奇闻杂技

    第一天 01 从计算机到程序设计语言 02 python环境配置 03 实例一:温度转换 04 python语法分析 第二天 01 深入理解python语言 02 实例二,python蟒蛇配置 03 ...

  2. typescript里一些有趣的点

    联合类型 在原生的JS里,null和undefined经常会导致BUG的产生, 在ts里,你又想用null,又担心出错的时候 你可以考虑用联合类型,当某值可能为 number或null,你可以声明它的 ...

  3. IT兄弟连 Java语法教程 Java语法基础 经典面试题

    1.Java语言中有几种基本类型?分别是什么?请详细说明每种类型的范围以及所占的空间大小? Java语言中有8中基本类型,分别是代表整形的byte.short.int和long,代表浮点型的float ...

  4. SpringBoot系列之Spring容器添加组件方式

    SpringBoot系列之Spring容器添加组件方式 本博客介绍SpringBoot项目中将组件添加到Spring容器中的方法,SpringBoot项目有一个很明显的优点,就是不需要再编写xml配置 ...

  5. 解决最新Java12 安装

    题外话: 因为我笔记本上的java用的版本是比较老的,从java8开始已经不再需要classpath java-home  path  这几个安装界的行业规范,基本上只需要安装 然后在path路径下 ...

  6. ARM64 的 memcpy 优化与实现

    参考:https://www.byteisland.com/arm64-%E7%9A%84-memcpy-%E6%B1%87%E7%BC%96%E5%88%86%E6%9E%90/ libc/stri ...

  7. html的特殊符号对照表

    HTML的特殊符号对照表. 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 特殊符号 命名实体 十进制编码 Α Α Α Β Β Β Γ Γ Γ Δ Δ Δ Ε Ε Ε Ζ Ζ Ζ Η ...

  8. [debug] 解决在C++编写过程中的“找到一个或多个多重定义的符号”

    如下图: 其在 common.h 中定义了一个变量a ,然后在两个 cpp 文件中都是用它. 在这种情况下,链接时就会出现 “找到一个或多个多重定义的符号”. 解决方案: 在某个cpp文件中定义,然后 ...

  9. PHP+Swoole 作为网络通信框架

    PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...

  10. CSS filter滤镜试玩

    1.模糊(blur). 用法:给相应元素设置高斯模糊,传入的px数值越大越模糊. 2.亮度(brightness). 用法:给元素设置亮度,0%为全黑,100%为元素原始亮度,>100%表示会比 ...