压面器,神墓 辰东 小说,人民医院官网
在go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体
当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射
反射还可以用作判断变量类型
整个reflect包中最重要的两个类型
获取到type和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
}
有三种级别日志输出
所有日志信息打印时都带有时间,且颜色为红色,输出日志信息到文件中
//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 打印日志信息
}
(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("程序结束")
}
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python爬虫:Request Payload和Form Data的简单区别说明
浅谈Python中threading join和setDaemon用法及区别说明
Python3-异步进程回调函数(callback())介绍
python继承threading.Thread实现有返回值的子类实例
Python中使用threading.Event协调线程的运行详解
网友评论