Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >9.Go-反射、日志和线程休眠

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

作者头像
zhang_derek
发布于 2019-08-12 07:49:38
发布于 2019-08-12 07:49:38
38500
代码可运行
举报
文章被收录于专栏:有趣的django有趣的django
运行总次数:0
代码可运行

9.1反射

在Go语言标准库中reflect包提供了运行时反射,程序运行过程中动态操作结构体

当变量存储结构体属性名称,想要对结构体这个属性赋值或查看时,就可以使用反射

反射还可以用作判断变量类型

整个reflect包中最重要的两个类型

  • reflect.Type类型
  • reflect.Value值

获取到Type和Value的函数

  • reflect.TypeOf(interface{})返回type
  • reflect.ValueOf(interface{})返回值Value

  (1)获取变量属性和值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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)获取结构体属性的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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()获取指针指向地址的封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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),标记通常都是通过反射技术获取到 

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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)

所有日志信息打印时都带有时间,且颜色为红色,输出日志信息到文件中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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)让程序阻塞多少纳秒

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//Learn_Go/main.go
package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("111")
	time.Sleep(2e9)     //2e9 相当于2秒
	fmt.Println("222")
}

(2)延迟执行

延迟指定时间后执行一次,但是需要注意在触发时程序没有结束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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("程序结束")
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-08-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang 反射
在Go语言中,大多数时候值/类型/函数非常直接,要的话,定义一个。你想要个Struct
李海彬
2019/03/07
9590
Golang 反射
013.反射reflection
反射reflection 反射可大大提高程序的灵活性,使得 interface{} 有更大的发挥余地 反射使用 TypeOf 和 ValueOf 函数从接口中获取目标对象信息 反射会将匿名字段作为独立字段(匿名字段本质) 想要利用反射修改对象状态,前提是 interface.data 是 settable, 即 pointer-interface 通过反射可以“动态”调用方法 ---- package main import ( "fmt" "reflect" ) type User
qubianzhong
2018/08/15
2300
Go语言——反射
反射是众多编程语言中的一个非常实用的功能,它是一种能够自描述、自控制的应用,Go语言也对反射提供了友好的支持。
传说之下的花儿
2023/04/16
1.6K0
Go语言——反射
上篇:Go的反射基础
TypeOf()方法获取到变量的类型后,再调用它的Kind()方法可以将返回的结果用来进行类型的判断
不背锅运维
2022/10/25
1880
上篇:Go的反射基础
Golang反射-上篇
反射是指在运行时动态的访问和修改任意类型对象的结构和成员,在go语言中提供reflect包提供反射的功能,每一个变量都有两个属性:类型Type和值Value
仙人技术
2021/11/12
8580
Golang反射-上篇
go语言反射
oValue := reflect.ValueOf(obj) field := oValue.Field(i) -> fieldValue :=value.Field(i).Interface{}(获取第i个属性的值的“正射”形式)
程序员小饭
2020/09/07
3880
Go通关16:运行时反射,深度解析!
对于反射,之前的文章已经有所介绍,传送门:《断言、反射的理解与使用!》,此处我们再深入讲解下反射。
微客鸟窝
2021/08/18
4230
golang中的反射
本文转载自https://github.com/KeKe-Li/For-learning-Go-Tutorial/edit/master/src/chapter07/01.0.md
ccf19881030
2020/12/16
1.2K0
Goalng下的反射模块reflect学习使用
注意:我们上面的示例是使用值类型进行进行反射构造的。如果是指针类型的话,我们需要使用reflect.Struct字段进行判断接口类型的Kind()方法
李海彬
2018/12/13
8430
GoLang反射
反射是 Go 语言比较重要的特性。虽然在大多数的应用和服务中并不常见,但是很多框架都依赖 Go 语言的反射机制实现简化代码的逻辑。因为 Go 语言的语法元素很少、设计简单,所以它没有特别强的表达能力,但是 Go 语言的 reflect 包能够弥补它在语法上的一些劣势。
大忽悠爱学习
2022/08/23
4860
GoLang反射
Go通关08:断言、反射的理解与使用!
您诸位好啊,我是无尘,学习Go语言肯定经常看到断言、反射这两个词,曾因为使用场景不太熟悉,让我很是费解,今天就好好唠唠!
微客鸟窝
2021/08/18
1.1K0
Go系列:通过反射来操作结构体
在日常开中,总是会有各种trick的需求,Go这种强类型语言按常规写法就不能完成一些需求,所以反射就是一般瑞士军刀,在某些场合可以用简单的方法功能。
用户9805946
2024/11/19
590
(四十五)golang--反射
反射注意事项和使用细节: (1)reflect.Vale.Kind,获取变量的类别,返回的是一个常量;
西西嘛呦
2020/08/26
3540
深入了解Golang中的反射机制
        反射是指在程序运行时动态地检查和修改对象的能力。在Go语言中,通过反射可以在运行时检查变量的类型、获取结构体字段和方法的信息,以及动态调用方法等操作。反射在一些需要处理未知类型或需要在运行时进行动态操作的场景中非常有用。
周小末天天开心
2023/10/16
3090
Golang的反射reflect深入理解和示例
在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。这是元编程的一种形式。它同时也是造成混淆的重要来源。
Allen.Wu
2022/11/13
5690
go-反射
反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。
新人小试
2020/03/23
8400
Go:反射(Reflection)
在Go语言中,反射是一个强大且复杂的特性,它允许程序在运行时检查对象的类型和值,甚至修改对象。反射在处理未知类型的数据时特别有用,例如解析JSON或在编写通用函数时。本文将通过一个实例详细介绍Go的反射,帮助大家理解和运用反射。
运维开发王义杰
2024/03/07
1240
Go:反射(Reflection)
【初识Go】| Day11 反射机制
第一个参数funcPtr以接口的形式传入函数指针,函数参数args以可变参数的形式传入,bridge函数中可以用反射来动态执行funcPtr函数。
yussuy
2020/12/24
4690
【初识Go】| Day11 反射机制
Go基础之--反射
反射:可以在运行时动态获取变量的相关信息 反射需要导入reflect 反射中重要函数的演示 反射有几下几个重要的函数: reflect.TypeOf :获取变量的类型,返回reflect.Type类型 reflect.ValueOf:获取变量的值,返回reflect.Value类型 reflect.Value.Kind:获取变量的类别,返回一个常量 reflect.Value.Interface():转换成interface{}类型 通过一个小例子来理解: package main import (
coders
2018/03/30
5820
Go基础之--反射
深入理解 go 反射
反射是可以让我们在程序运行时(runtime)访问、检测和修改对象本身状态或行为的一种机制。
leobhao
2024/04/01
1300
深入理解 go 反射
相关推荐
Golang 反射
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验