golang实现PHP数组特性的方法

目录
  • 前言
  • 内容
    • 1. php 处理复杂结构
    • 2. golang 处理复杂结构
    • 3. dataBox 复杂结构处理
  • 总结

前言

我们做业务过程中,对应强类型语言使用有个痛点,就是使用变量之前一定要定义变量类型,比如c,c++,golang等,弱类型语言择不需要,可以直接读写,比如php。下面通过php和golang语言举例说明,对于强弱类型语言变量类型的使用情况,并提出自己的解决方案databox。

内容

复杂结构处理

1. php 处理复杂结构

1.1 读取值

<?php
$country = [
    "china"=>[
            "陕西"=>["西安市","宝鸡市","渭南市"],
            "北京"=>["朝阳区","海淀区","通州区"]
    ],
];

print_r($country["china"]["陕西"][0]);

打印结果
西安市

1.2 写入值

<?php
$country = [
    "china"=>[
        "陕西"=>["西安市","宝鸡市","渭南市"],
        "北京"=>["朝阳区","海淀区","通州区"]
    ],
];

$country["美国"]["纽约州"][0] = "纽约";

var_dump($country);

打印结果
array(3) {
  ["china"]=>
  array(2) {
    ["陕西"]=>
    array(3) {
      [0]=>
      string(9) "西安市"
      [1]=>
      string(9) "宝鸡市"
      [2]=>
      string(9) "渭南市"
    }
    ["北京"]=>
    array(3) {
      [0]=>
      string(9) "朝阳区"
      [1]=>
      string(9) "海淀区"
      [2]=>
      string(9) "通州区"
    }
  }
  ["america"]=>
  array(0) {
  }
  ["美国"]=>
  array(1) {
    ["纽约州"]=>
    array(1) {
      [0]=>
      string(6) "纽约"
    }
  }
}

说明

  • php操作数组的时候,不需要考虑对应的下标值是否存在,可以直接使用。

2. golang 处理复杂结构

2.1 读取值

package main

import "fmt"

func main() {
   country := map[string]interface{}{
      "china": map[string]interface{}{
         "陕西": []interface{}{"西安市", "宝鸡市", "渭南市"},
         "宝鸡": []interface{}{"朝阳区", "海淀区", "通州区"},
      },
   }

   china := country["china"] //第一步
   shanxi := china.(map[string]interface{})["陕西"] //第二步
   xian := shanxi.([]interface{}) //第三步
   fmt.Println(xian[0])
}

打印结果
西安市

分三步

  • 第一步 创建变量china 值为country变量key为“china”对应的值
  • 第二步 创建变量shanxi 只对china变量key为“陕西”对应的值,其中对于china使用了断言
  • 第三步 创建xian 变量,取值为shanxi对于下标为0的值,其中对于shanxi使用了断言

因为对象有三层,所以用了三步,每次取一层数据,然后断言在取第二层数据,接着又断言,同理如果对象有N层,获取N层的值,需要N步。
2.2 写入值

package main

import "fmt"

func main() {
   country := map[string]interface{}{
      "中国": map[string]interface{}{
         "陕西": []interface{}{"西安市", "宝鸡市", "渭南市"},
         "宝鸡": []interface{}{"朝阳区", "海淀区", "通州区"},
      },
   }

   city := []interface{}{"纽约"} //第一步
   province := map[string]interface{}{"纽约州": city} //第二步
   country["美国"] = province //第三步
   fmt.Println(country)
}

打印结果
map[中国:map[宝鸡:[朝阳区 海淀区 通州区] 陕西:[西安市 宝鸡市 渭南市]] 美国:map[纽约州:[纽约]]]

说明 需要在country下写入美国,纽约州,下面为纽约的数据。
分三步

  • 第一步 先创建纽city数组,第一个索引对应为“纽约”
  • 第二步 创建province map对象,元素为key为“纽约州”值为city数组
  • 第三步 将country 写入key“美国”,值为province 对象

因为要写入的数据处在第三层,所有需要三步,才能赋值完成,如果对象为N层,需要在N层写入数据,所有需要N步

3. dataBox 复杂结构处理

  • api层:提供初始化函数NewDataBox,get,getString,getMap 获取变量为了函数,set 写入变量函数
  • 数据处理引擎层:负责修改和读取数据
  • 数据存储层:负责保存数据

3.1 读数据

package main

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

func main() {
   country := map[string]interface{}{
      "中国": map[string]interface{}{
         "陕西": []interface{}{"西安市", "宝鸡市", "渭南市"},
         "宝鸡": []interface{}{"朝阳区", "海淀区", "通州区"},
      },
   }

   dbx := databox.NewDataBox(country)
   xian := dbx.GetString("中国.陕西.0")
   fmt.Println(xian)
}

打印结果
西安

通过GetString 传入key “中国.陕西.0”,直接就可以获取对应的值“西安”,只有一步操作。

3.2 写数据

package main

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

func main() {
   country := map[string]interface{}{
      "中国": map[string]interface{}{
         "陕西": []interface{}{"西安市", "宝鸡市", "渭南市"},
         "宝鸡": []interface{}{"朝阳区", "海淀区", "通州区"},
      },
   }

   dbx := databox.NewDataBox(country)
   dbx.Set("美国.纽约州.0", "纽约")
   fmt.Println(dbx.Data())
}

打印结果
map[中国:map[宝鸡:[朝阳区 海淀区 通州区] 陕西:[西安市 宝鸡市 渭南市]] 美国:map[纽约州:[纽约]]]

使用set方法直接对应key“美国.纽约州.0”写入对应的值就可以。

总结

  • 弱类型语言php可以直接对数值读写,不需要提前知道变量类型,也不需要知道变量内部构造
  • 强类型语言golang不能直接读写数据,需要对数据类型进行断言,才能写入,需要知道变量内部构造

到此这篇关于golang实现PHP数组特性的方法的文章就介绍到这了,更多相关golang实现PHP数组特性内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang、python、php、c++、c、java、Nodejs性能对比

    本人在PHP/C++/Go/Py时,突发奇想,想把最近主流的编程语言性能作个简单的比较, 至于怎么比,还是不得不用神奇的斐波那契算法.可能是比较常用或好玩吧. 好了,talk is cheap, show me your code! 打开Mac,点开Clion开始Coding吧! 1.怎么第一是Go呢,因为我个人最近正在用,感觉很不错 package main import "fmt" func main(){ fmt.Println(fibonacci(34)) } func fib

  • golang与php实现计算两个经纬度之间距离的方法

    本文实例讲述了golang与php实现计算两个经纬度之间距离的方法.分享给大家供大家参考,具体如下: golang版本: 复制代码 代码如下: package main import (     "fmt"     "math" ) func main() {     lat1 := 29.490295     lng1 := 106.486654     lat2 := 29.615467     lng2 := 106.581515     fmt.Printl

  • golang与PHP输出excel示例

    本文实例讲述了golang与PHP输出excel的方法.分享给大家供大家参考,具体如下: 以前输入excel的时候utf8总是乱码还是用其他方式把utf8转换为gbk才能显示,呵呵,其实是输出了csv,后来群里的朋友说需要utf8 BOM Excel才能正常识别utf8,今天测试了一下,很爽,比以前省了好几行代码. golang实现: 复制代码 代码如下: package main import (     "os"     "encoding/csv" ) fun

  • golang实现php里的serialize()和unserialize()序列和反序列方法详解

    Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 package main import ( "fmt" "github.com/techleeone/gophp/serialize" ) func main() { str := `a:1:{s:3:"php";s:24:"世界上最好的语言&

  • Golang加密解密之RSA(附带php)

    RSA加密算法简史 RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. RSA加密算法原理 学过算法的朋友都知道,计算机中的算法其实就是数学运算.所以,再讲解RSA加密算法之前,有必要了解一下一些必备的数学知识.我们就从数学知识开始讲解. 必备数学知识 RSA加密算法中,只用到素数.互质数.指数运算.模运算等

  • golang 调用 php7详解及实例

    执行php文件 func Test_exec(t *testing.T) { engine.Initialize() ctx := &engine.Context{ Output: os.Stdout, } err := engine.RequestStartup(ctx) if err != nil { fmt.Println(err) } defer engine.RequestShutdown(ctx) err = ctx.Exec("/tmp/index.php") i

  • golang实现PHP数组特性的方法

    目录 前言 内容 1. php 处理复杂结构 2. golang 处理复杂结构 3. dataBox 复杂结构处理 总结 前言 我们做业务过程中,对应强类型语言使用有个痛点,就是使用变量之前一定要定义变量类型,比如c,c++,golang等,弱类型语言择不需要,可以直接读写,比如php.下面通过php和golang语言举例说明,对于强弱类型语言变量类型的使用情况,并提出自己的解决方案databox. 内容 复杂结构处理 1. php 处理复杂结构 1.1 读取值 <?php $country =

  • 深度剖析Golang中的数组,字符串和切片

    目录 1. 数组 1.1 定义数组 1.2 访问数组 1.3 修改数组 1.4 数组长度 1.5 遍历数组 1.6 多维数组 2. 切片 2.1 定义切片 2.2 访问切片元素 2.3 修改切片元素 2.4 切片长度和容量 2.5 向切片中添加元素 2.6 切片的切片 2.7 切片排序 3. 字符串 3.1 访问字符串中的字符 3.2 字符串切片 3.3 字符串操作 3.4 关于字符串的常见问题 4. 总结 1. 数组 数组是 Golang 中的一种基本数据类型,用于存储固定数量的同类型元素.在

  • ECMA5数组的新增方法有哪些及forEach()模仿实现

    下面通过一段代码示例给大家介绍ECMA5数组的新方法forEach()模仿实现,具体代码如下所示, var o = { forEach: function (callback) { // alert(this.length); for (var i = , len = this.length; i < len; i++) { callback && callback(this[i], i, this); } }, get length(){ var sum=; for(var n i

  • Javascript数组中push方法用法分析

    本文实例讲述了Javascript数组中push方法用法.分享给大家供大家参考,具体如下: 看下面代码: var o = { 1:'a' ,2:'b' ,length:2 ,push:Array.prototype.push }; o.push('c'); Q:o现在内部的值是什么样子? 我的第一反应是排斥,为什么要研究不合理情况下[解释引擎]的行为?但是这种推论有时候又很吸引人,于是我回来的时候仔细思考了下,发现其实很简单. 对于push这个方法,我条件反射地想到的就是栈,[数据结构的经典栈]

  • javascript数组拍平方法总结

    在开发过程中有得时候总是碰一些共性的问题,比如将一个二维数组拍平成一维数组,或者三维数组拍平成一维数组.这些问题在遇到的时候总会重新思考,不如将其提炼出来,总结一下. 下面笔者将为大家演示一下,将一个多维数组拍平成一个一维数组的两种方法,算是抛砖引玉,大家有更好的方法可以在留言区发表. 首先是第一种方法,递归处理,代码如下: var arr = [1, 2, 3, [3, 3, 3, [5, 4, 5, 6, 6, 7, 8]], [333, 4444] ]; function product(

  • JS学习笔记之数组去重实现方法小结

    本文实例讲述了JS学习笔记之数组去重实现方法.分享给大家供大家参考,具体如下: 操作的数组 let arr=[0,1,23,'1',4,2,8,5,5,6,9,'asdasd','5'] 1. 利用ES6 的set 来进行数组去重 console.time("set") let type1=new Set(arr) console.log(type1) type1=[...type1] console.log(type1) console.timeEnd("set"

  • java可变参数当做数组处理的方法示例

    本文实例讲述了java可变参数当做数组处理的方法.分享给大家供大家参考,具体如下: java可变参数当做数组处理 ava1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理. 注意:可变参数必须位于最后一项. 原因:当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点:

  • JavaScript数组特性与实践应用深入详解

    本文实例讲述了JavaScript数组特性与实践应用.分享给大家供大家参考,具体如下: JavaScript 提供了一种类似数组特性的对象,它把数组的下标变为字符串,作为对象的属性.虽然它比一个真正的数组来的慢,但是使用起来很方便. 1 数组字面量 数组字面量是在一对方括号中包围零个或多个用逗号分隔的值的表达式: var empty = []; var numbers = [ 'zero', 'one', 'two', 'three' ]; console.log(empty[1]);//und

  • JavaScript 高性能数组去重的方法

    中午和同事吃饭,席间讨论到数组去重这一问题 我立刻就分享了我常用的一个去重方法,随即被老大指出这个方法效率不高 回家后我自己测试了一下,发现那个方法确实很慢 于是就有了这一次的高性能数组去重研究 一.测试模版 数组去重是一个老生常谈的问题,网上流传着有各种各样的解法 为了测试这些解法的性能,我写了一个测试模版,用来计算数组去重的耗时 // distinct.js let arr1 = Array.from(new Array(100000), (x, index)=>{ return index

  • 详解js模板引擎art template数组渲染的方法

    JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注,模板引擎种类也是五花八门,我就说几个安全性高.错误处理调试优,执行速度快的有artTemplate(腾讯 14k).juicer(国外 12k)这俩个,doT除了错误处理调试差以外其他的都和这两个一样,他有一个优点是小(4k),扯远啦. art-template 是一个简约.超快的模板引擎. 什么是art-template art-template 是一个简约.超快的模板引擎.它采用作用域预声明的技术来优化模板

随机推荐