【go实战系列一】开篇:在循环中重新定义变量(redefining for loop variable semantics)
【go实战系列二】关于切片的基本操作 copy sort append 快速复制 排序 删除操作
这是根据go在项目实战中,作者发掘的问题与技巧,希望能与所有的gopher一起分享,一起成长,如果文章有错误,也请大家及时指正问题,作者会立刻修改
反射是指在程序运行期间对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。
支持反射的语言可以在程序编译期间将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期间获取类型的反射信息,并且有能力修改它们。
这里也会埋下一些问题,后面我们会继续说明
Go程序在运行期间使用reflect包访问程序的反射信息。
在Go语言中反射的相关功能由内置的reflect包提供,任意接口值在反射中都可以理解为由reflect.Type和reflect.Value两部分组成,并且reflect包提供了reflect.TypeOf
和reflect.ValueOf
两个函数来获取任意对象的Value和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
}
如何快速将数组变为切片?
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
关于切片的一些基础知识
希望对大家能够有帮助