【go实战系列三】golang 反射 reflect 的基本使用以及什么时候使用反射

历史go篇章

【go实战系列一】开篇:在循环中重新定义变量(redefining for loop variable semantics)
【go实战系列二】关于切片的基本操作 copy sort append 快速复制 排序 删除操作


文章目录

  • 历史go篇章
  • 前言
  • 一、反射介绍
      • 1、runtime 运行时
      • 2、reflect go反射包
  • 二、reflect 反射
      • 1、reflect.Type
      • 2、reflect.Value
  • 三、sort
  • 四、速删除切片
  • 总结


前言

这是根据go在项目实战中,作者发掘的问题与技巧,希望能与所有的gopher一起分享,一起成长,如果文章有错误,也请大家及时指正问题,作者会立刻修改


一、反射介绍

1、runtime 运行时

反射是指在程序运行期间对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。

支持反射的语言可以在程序编译期间将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期间获取类型的反射信息,并且有能力修改它们。

这里也会埋下一些问题,后面我们会继续说明

2、reflect go反射包

Go程序在运行期间使用reflect包访问程序的反射信息。

二、reflect 反射

在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOfreflect.ValueOf两个函数来获取任意对象的Value和Type。

1、reflect.Type

反射中最核心的方法之一

package main

import (
	"fmt"
	"reflect"
)

func reflectType(x interface{}) {
	v := reflect.TypeOf(x)
	fmt.Printf("type:%v \n", v)
}
func main() {
	var a float32 = 6.66
	reflectType(a) // type:float32
	var b int64 = 666
	reflectType(b) // type:int64
}

2、reflect.Value

三、sort

如何快速将数组变为切片?
arr[:] 数组从头取到尾

代码片段如下:

func main() {
	// sort 对int类型数组进行排序
	arr := [...]int{3, 7, 9, 4, 6, 1}
	// 这里数组转切片 arr[:]
	sort.Ints(arr[:])
	fmt.Println(arr)
}

四、速删除切片

代码片段如下:

func main() {
	slice1 := []string{"tom", "jack", "rose", "jim"}
	fmt.Printf("slice1---%p,%v,len:%d,cap:%d \n", slice1, slice1, len(slice1), cap(slice1))

	slice1 = append(slice1[1:2], slice1[3:]...)
	fmt.Printf("slice1---%p,%v,len:%d,cap:%d \n", slice1, slice1, len(slice1), cap(slice1))

}

输出结果:
slice1—0xc00005a040,[tom jack rose jim],len:4,cap:4
slice1—0xc00005a050,[jack jim],len:2,cap:3

总结

关于切片的一些基础知识
希望对大家能够有帮助

你可能感兴趣的:(go,golang,java,前端)