golang 神器 处理复杂数据结构 读写数据问题,不再用断言

593 阅读3分钟

golang 是一种强类型的语言,对于复杂结构的数据读写,必须对未知结构进行断言,而且对于复杂多层结构,需要层层断言,代码极其冗余,难看,对于初学者来说困难大,通过databox类包可以把复杂的数据结构操作工作释放出来。

php是一个弱类型语言,在创建修改复杂数据结构的时候,可以直接赋值,直接读写,不需要判断结构是否存在。下面是本人开发的golang 类包介绍。

一、基础知识

强类型:使用变量或者数据之前,必须知道其类型。

弱类型:使用之前不需要知道期类型,直接使用即可。

复杂多层数据结构:层级不确定,每一次的数据类型不确定。

反射:通过变量值获取变量类型,变量方法,变量结构的方式。

nil: 空值

slice: golang 数组切片

map:golang 数组对象

interface{}:未知类型,空类型

索引下标:切片数组或者字典由一系列的相同类型的变量组成的集合,每一个变量都对于一个下标,这个下标值叫索引值,可以根据对于索引下标取到对于的变量。

引用传递:传递的是源数据数据对应的地址,如果在函数体里面对数据修改,会影响原值

值传递:传递的是源数据的copy,就是对源数据复制一份,那么在函数体里面修改传递的数据值,不会影响源数据

二、databox类包四个模块

1、初始化

传入初始化data,data 可以是任意层数slice,或者任意层数的map和slice,或者为 nil, golang 里面map 和 slice 是引用传值,如果对传的参数进行修改,会改变原值,所有需要copy 一份数据。

Data 指的的数据盒子里面存入的初始化话数据,类型可以是切片,字典等等值;初始化话数据data需要复制一份,因为字典,切片类型传值是引用传递,直接修改源数据data,会破坏原始数据,所以复制。

2、set 模块

对data结构进行修改。

Data 指的是源数据,对源数据修改包含,新增结构,和修改结构,和新增变量,修改变量值等等。

根据paths (路径)创建一个临时的temp 结构(临时定义结构),然后和初始化的data 结构进行合并。

Paths 指的取结构中某个值的路径。对源数据进行修改,并不是直接修改源数据,而是根据要设置的变量路径,创建一个新的临时变量,然后和源数据体合并。合并过程中用到了递归和反射,断言操作,具体细节比较难懂,这里不展开细节。

3、get模块

对data模块内容进行取值,根据paths 递归取数据值,如果数据不存在,择返回nil

说明 Data 指的是源数据,Paths 指的取结构中某个值的路径

4、获取data

返回修改后data结构数据,Data 指的是源数据

三、代码事例

1、对于目标值为空变量写
package main

import (
"fmt"
"github.com/codewangz/goutils/databox"
)

func main() {

dbx :=databox.NewDataBox()

dbx.Set("0", "你好")

dbx.Set("1.a", "aaa")

fmt.Println(dbx.Data())

}

打印结果: [你好 map[a:aaa]]

2、对于目标值为非空的写入
package main

import (

"fmt"

"github.com/codewangz/goutils/databox"

)

func main() {

data := []interface{}{"hello", "world"}

dbx :=databox.NewDataBox(data)

dbx.Set("0", "你好")

dbx.Set("1", "世界")

fmt.Println(dbx.Data())

}

打印结果: [你好 世界]

3、通过数据路径读取数值
package main

import (

"fmt"

"github.com/codewangz/goutils/databox"

)

func main() {

data := []interface{}{"hello", "world", map[string]interface{}{"a":"aaa"}}

dbx :=databox.NewDataBox(data)

fmt.Println(dbx.GetString("0"))

fmt.Println(dbx.GetMapInterface("2"))

fmt.Println(dbx.GetString("2.a"))

fmt.Println(dbx.Get("3"))

}

打印结果:

hello

map[a:aaa]

aaa