当前位置: 移动技术网 > IT编程>脚本编程>Python > 9.Go-反射、日志和线程休眠

9.Go-反射、日志和线程休眠

2019年08月11日  | 移动技术网IT编程  | 我要评论

压面器,神墓 辰东 小说,人民医院官网

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("程序结束")
}

  

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网