61396-Go语言程序设计项目化教程(微课版)5.1 反射与文件.pptx
《61396-Go语言程序设计项目化教程(微课版)5.1 反射与文件.pptx》由会员分享,可在线阅读,更多相关《61396-Go语言程序设计项目化教程(微课版)5.1 反射与文件.pptx(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、反射与文件反射与文件reflect反射基本概念文件操作反射修改变量压缩归档文件操作01.03.02.04.目录01reflect反射基本概念反射定义TypeValue1reflectreflect反射基本概念反射基本概念反射是指在程序运行期间对程序本身进行访问和修改的能力。一般地,程序在编译时,变量会被转换为内存地址,但变量名不会被编译器写入到可执行部分。因此在运行程序时,程序无法获取自身的信息。支持反射的语言则可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go
2、语言提供了一种机制在运行时更新和检查变量的值、调用变量的方法和变量支持的内在操作,但是在编译时并不知道这些变量的具体类型,这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。Go程序在运行期使用reflect包访问程序的反射信息;主要涉及到Type和Value这两个基本概念。反射定义1reflectreflect反射基本概念反射基本概念reflect.TypeOf(varname).Kind()反射获取变量类型的详细信息reflect.TypeOf(varname).Kind()=reflect.Type反射类型详细信息和基本类型比较注:reflect.Type的Type表示
3、数据变量类型,比如int、float64、string等。reflect.TypeOf(varname)反射获取变量类型package mainimport(fmt reflect)func main()var a int fmt.Println(reflect.TypeOf(a).Name()fmt.Println(reflect.TypeOf(a).Kind()fmt.Println(reflect.TypeOf(a).Align()fmt.Println(reflect.TypeOf(a).Kind()=reflect.Float32)运行结果为:intint8false1reflect
4、reflect反射基本概念反射基本概念reflect.ValueOf(&varname)反射获取指向变量的指针注:&varname表示传入变量地址。需要注意的是,Go语言中不能直接对指针进行运算符或者修改操作,因此通常会使用Elem()函数获取指针指向的值,方便后续对该值进行操作。reflect.ValueOf(varname)反射获取变量值package mainimport(fmt reflect)func main()var a int a=10 fmt.Println(reflect.ValueOf(a)fmt.Println(reflect.ValueOf(&a)fmt.Printl
5、n(reflect.ValueOf(&a).Elem()运行结果为:100 xc00000a09810reflect.ValueOf(&varname).Elem()反射获取指针地址所指向的值1reflectreflect反射基本概念反射基本概念package mainimport(fmt reflect)type Person struct Name string Age intfunc main()p:=&Person Name:Go,Age:20,fmt.Println(reflect.ValueOf(&p)fmt.Println(reflect.ValueOf(p).Elem()fmt
6、.Println(reflect.ValueOf(p).Type()fmt.Println(reflect.ValueOf(p).Kind()fmt.Println(reflect.TypeOf(p)fmt.Println(reflect.TypeOf(p).Elem()fmt.Println(reflect.TypeOf(p).Name()fmt.Println(reflect.TypeOf(p).Kind()fmt.Println(reflect.TypeOf(p).Size()运行结果为:0 xc000006028Go 20*main.Personptr*main.Personmain.
7、Personptr802反射修改变量反射修改变量反射修改切片反射修改切片索引值2反射修改变量反射修改变量在使用reflect.ValueOf()的Elem()函数时,如果ValueOf()传入的是变量的地址,那么就可以通过反射去修改变量的值。注:SetType()中的Type表示具体的数据类型,比如SetString()、SetInt()等。reflect.ValueOf(&x).Elem().Set()反射修改变量reflect.ValueOf(&x).Elem().SetType()反射修改变量类型package mainimport(fmt reflect)func main()var
8、a int a=10 var b int=5 reflect.ValueOf(&a).Elem().Set(reflect.ValueOf(b)fmt.Println(a)reflect.ValueOf(&a).Elem().SetInt(20)fmt.Println(a)运行结果为:5202反射修改变量反射修改变量intSliceElemValue:=reflect.ValueOf(&intSlice).Elem()newValue:=reflect.ValueOf(newSliceValue)intSliceElemValue.Set(newValue)反射修改整个切片注:首先使用 ref
9、lect.ValueOf 传入要修改的切片的地址,并且使用 Elem 获取指针信息;接着使用 reflect.ValueOf 传入一个新的切片;最后使用Set 方法传入新的切片的 Value 信息,完成对原切片值的修改。intSliceValue:=reflect.ValueOf(intSlice)e:=intSliceValue.Index(index_size)e.SetInt(newvarname)反射修改切片索引值注:在Go语言中,如果通过反射的reflect.ValueOf()获得反射的对象信息是结构体类型,则可以通过Elem()函数来修改字段值。package mainimport
10、(fmt reflect)func main()var intSlice=int1,2,3,4 intSliceElemValue:=reflect.ValueOf(&intSlice).Elem()if intSliceElemValue.CanSet()newSliceValue:=int11,12,13,14 newVale:=reflect.ValueOf(newSliceValue)intSliceElemValue.Set(newVale)fmt.Println(NewSliceVal=,intSlice)运行结果为:NewSliceVal=11 12 13 142反射修改变量反射
11、修改变量利用反射去修改整个切片函数CanSet()用于判断指针指向的对象是否可以被修改package mainimport(fmt reflect)func main()var intSlice=int1,2,3,4 intSliceValue:=reflect.ValueOf(intSlice)e:=intSliceValue.Index(0)if e.CanSet()e.SetInt(11)fmt.Println(NewVal=,intSliceValue)运行结果为:NewVal=11 2 3 42反射修改变量反射修改变量利用反射去修改切片索引值函数Index()用于获取所需要修改索引处
12、的值信息2反射修改变量反射修改变量personNameValue:=reflect.ValueOf(&struct.name)personNameValue.Elem().SetString(newvarname)反射修改结构体字段值注:&struct.name表示获取结构体中字段名的地址,newvarname为修改后的字段值。package mainimport(fmt reflect)type Person struct Name string Age intfunc main()p:=Person Name:GO,Age:20,personNameValue:=reflect.Value
13、Of(&p.Name)personAgeValue:=reflect.ValueOf(&p.Age)personNameValue.Elem().SetString(golang)personAgeValue.Elem().SetInt(18)fmt.Println(p)运行结果为:golang 1803文件操作创建文件打开文件写入文件读取文件拷贝文件关闭文件3文件操作文件操作注:name为文件名,返回值为打开文件的句柄,失败则返回error错误信息,否则返回nil。func Open(name string)(*File,error)func(file*File)Close()error打开
14、文件函数关闭文件函数注:file为打开的文件,失败则返回error错误信息,否则返回nil。注:Create采用模式0666(任何人都可读写,不可执行)创建一个名为name的文件。如果文件已存在会截断它(为空文件)。创建成功则返回的文件对象可用于I/O;对应的文件描述符具有O_RDWR模式。创建失败则返回错误信息,错误底层类型是*PathError。func Create(name string)(file*File,err error)创建文件函数3文件操作文件操作文件读取ioutil.ReadFile()file.Read()bufio.NewReader()ioutil.ReadAll(
15、)func ReadFile(filename string)(byte,error)ioutil.ReadFile()注:上述函数不需要手动打开与手动关闭文件,其中filename表示文件名,返回值byte代表文件内容,该函数会以字节数组形式读取文件内容。func ReadAll(file io.Reader)(byte,error)ioutil.ReadAll()注:使用上述函数之前,需要先行手动打开文件获得文件句柄,然后通过文件句柄来读取文件,其中file表示文件句柄。3文件操作文件操作func(f*File)Read(b byte)(n int,err error)file.Read(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 61396-Go语言程序设计项目化教程微课版5.1 反射与文件 61396 Go 语言程序设计 项目 教程 微课版 5.1 反射 文件
限制150内