zoukankan      html  css  js  c++  java
  • PHP转Go系列:数组与切片 转

    数组的定义#

    用过PHP的同学应该很清楚,无论多么复杂的数据格式都可以用数组来表达,什么类型的数据都可以往里塞,它是工作必备的一部分,使用很简单,易用程度简直变态。

    Copy
    $array = [1, 'name', ['sex' => '男']];
    

    在Go语言中就有所不同了,数组是一段固定长度的连续内存区域,与C语言概念完全一致,在声明数组时,要先确定数组的长度,而且数组中的元素只能使用一种类型,心痛,我们再也不能随心所欲的存储数据了。

    Copy
    array := [3]int{1, 2, 3}
    

    以上是数组在Go语言中的定义方法,[3]代表数组长度为3,int是数组中元素的类型,花括号中的是数组元素,切记元素个数与类型一定要与前面声明的相符,否则会报错。除了这种方式,PHP中还有一种动态赋值的方法,代码如下。

    Copy
    $array = [];
    $array[0] = 'name';
    $array[1] = 1;
    print_r($array);
    
    //output
    Array
    (
        [0] => name
        [1] => 1
    )
    

    Go语言也能做到,不过别想那么多,要存储不同数据类型的元素就别想了(其实也不是没有办法,后续文章讲解)。可以通过var声明一个数组,数组的长度和类型提前定义好,接下来就可以根据数组下标来赋值了,可以不必为每个下标赋值,但是切记下标不能越界,否则会报错。

    Copy
    var array [3]string
    array[0] = "name"
    array[1] = "sex"
    fmt.Print(array) //output [name sex ]
    

    每次声明数组时都要数一下元素个数写在中括号里也太鸡肋了,这点Go不可能想不到,果然,可以用...方法来省略掉中括号的数值,这样编译器会自动确定数组中的元素。

    Copy
    array := [...]string{"a", "b", "c", "d"}
    fmt.Print(array) //output [a b c d]
    

    数组的遍历#

    数组已经定义了,来看一下怎么遍历,在PHP中通过foreach进行遍历。

    Copy
    $array = ["a", "b", "c", "d"];
    foreach($array as $k => $v) {
    	echo $v;
    }
    //output abcd
    

    Go的写法很类似,通过range进行遍历,只是语法看起来有点怪怪的。

    Copy
    array := [...]string{"a", "b", "c", "d"}
    for k, v := range array {
    	fmt.Print(k, v)
    }
    //output 0a1b2c3d
    

    在Go中没有使用的变量在编译时会报错,那遍历时的k不见得会用到,那怎么解决变量k未被使用的问题呢?其实可以使用Go内置的符号_来替换掉变量k,它的意思是把当前赋的值丢弃掉。

    Copy
    array := [...]string{"a", "b", "c", "d"}
    for _, v := range array {
    	fmt.Print(v)
    }
    //output abcd
    

    数组的截取#

    PHP中对数组截取通过array_slice函数,以下代码是从数组的第二个元素开始,截取两个元素。

    Copy
    $array = [1, 2, 3, 4, 5];
    print_r(array_slice($array, 1, 2));
    
    //output
    Array
    (
        [0] => 2
        [1] => 3
    )
    

    在Go中更简单一些,可以直接取出第二到第四个元素之间的数据,值得注意的是,取出来的已经不是数组了,叫做切片,记住了,从数组切出来的部分就叫切片,数组与切片最简单的区别就是:数组需要明确指定大小,切片不需要,数组是值传递,切片是地址传递。不过目前还是把它当数组好了。

    Copy
    array := [...]int{1, 2, 3, 4, 5}
    fmt.Print(array[1:3])
    

    数组的追加#

    在PHP中为数组添加一个新元素使用array_push函数。

    Copy
    $array = [1, 2, 3, 4, 5];
    array_push($array, 6);
    print_r($array);
    
    //output
    Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
    )
    

    在Go中使用append函数,注意这里实际上是对切片的添加而不是数组。

    Copy
    array := []int{1, 2, 3, 4, 5}
    array = append(array, 6)
    fmt.Print(array) //output [1 2 3 4 5 6]
    

    数组元素的删除#

    在PHP中删除数组元素非常简单,直接unset即可,以下代码是删除第二个元素。

    Copy
    $array = [1, 2, 3, 4, 5];
    unset($array[1]);
    print_r($array);
    
    //output
    Array
    (
        [0] => 1
        [2] => 3
        [3] => 4
        [4] => 5
    )
    

    Go中比较特别,它并没有提供原生的删除方法,只能利用切片的特性,我们定义删除的元素索引为1,然后将1前面的元素与1后面的元素拼接起来,就过滤掉了第1个元素,感觉这种实现方式有点投机,不知道为什么不提供函数来操作。

    Copy
    index := 1
    array := []int{1, 2, 3, 4, 5}
    array = append(array[:index], array[index+1:]...)
    fmt.Print(array) //output [1 3 4 5]
    

     原文 https://www.cnblogs.com/pingyeaa/p/11013005.html

  • 相关阅读:
    转:浅谈UNIX下Apache的MPM及httpd.conf配置文件中相关参数配置
    LINUX DNS解析的3种修改方法~
    Linux ftp访问控制配置,包括访问ftp权限和访问ftp目录权限
    composer 安装提示 PHP Warning: readfile(): SSL operation failed with code 1
    PHPExcel yii2 加载使用
    转:mysql根据经纬度查找排序
    bootstrap无限级分类 jq拓展 之前的无限级分类的封装版~
    ACM学习历程—HDU1717 小数化分数2(gcd)
    ACM学习历程—HDU1716 排列2(dfs && set容器)
    ACM学习历程—BestCoder 2015百度之星资格赛1001 大搬家(递推 && 组合数学)
  • 原文地址:https://www.cnblogs.com/brady-wang/p/12992554.html
Copyright © 2011-2022 走看看