数组的定义#

用过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

PHP转Go系列:数组与切片 转的更多相关文章

  1. Go语言系列(三)之数组和切片

    <Go语言系列文章> Go语言系列(一)之Go的安装和使用 Go语言系列(二)之基础语法总结 1. 数组 数组用于存储若干个相同类型的变量的集合.数组中每个变量称为数组的元素,每个元素都有 ...

  2. PHP转Go系列:数组与切片

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

  3. go语言教程之浅谈数组和切片的异同

    Hello ,各位小伙伴大家好,我是小栈君,上次分享我们讲到了Go语言关于项目工程结构的管理,本期的分享我们来讲解一下关于go语言的数组和切片的概念.用法和区别. 在go语言的程序开发过程中,我们避免 ...

  4. GO语言总结(3)——数组和切片

    上篇博文简单介绍了一下Go语言的基本类型——GO语言总结(2)——基本类型,本篇博文开始介绍Go语言的数组和切片. 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. ( ...

  5. golang笔记——数组与切片

    一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...

  6. Go - 数组 和 切片(array、slice)

    一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建 数组有 3 种创建方式: 1) [length]Type 2) [length]Type{value ...

  7. GO语言数组和切片实例详解

    本文实例讲述了GO语言数组和切片的用法.分享给大家供大家参考.具体分析如下: 一.数组 与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列. (1)数组的创建. 数组有3种创建方式: ...

  8. Go数组、切片、映射的原理--简明解析

    数组.切片.映射是Golang的最重要的数据结构,下面是对这3种数据结构的一点个人总结: 一.数组 数组是切片和映射的基础数据结构. 数组是一个长度固定的数据类型,存储着一段具有相同数据类型元素的连续 ...

  9. go语言的数组和切片区别

    这里不介绍数组和切片的使用技巧,主要看下2者的区别. 首先看下它们的定义: 数组:类型 [n]T 表示拥有 n 个 T 类型的值的数组. 切片:类型 []T 表示一个元素类型为 T 的切片. 看一个数 ...

随机推荐

  1. 突然虚拟机无法联网解决办法,且报错Failed to start LSB: Bring up/down

    使用sudo service network restart去启动网络时起不来 使用systemctl status network.service查看网络状态也是failed,且报错Failed t ...

  2. python中unittest参数化

    先安装 pip install parameterized 在测试用例类中,@parameterized.parameterized.expand(这里面传一个列表),这个就是参数化的意思

  3. u深度win10pe装机版制作教程

    一款功能强大的u盘启动盘要怎么制作是非常重要的,对于大多数用户来说其中操作步骤并不熟悉.这里小编带来时下最新的u深度win10pe装机版制作教程,教你如何快速的进行u深度U盘的制作,下面就跟小编一起进 ...

  4. Vue axios封装 实现请求响应拦截

    封装 axios.js import axios from 'axios' import { baseURL } from '@/config' class HttpRequest { constru ...

  5. J.U.C之Executor框架入门指引

    1.Executor接口 This interface provides a way of decoupling task submission from the mechanics of how e ...

  6. MySQL存储引擎入门介绍

    什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的. ...

  7. 项目里出现两个配置类继承WebMvcConfigurationSupport时,为什么只有一个会生效(源码分析)

    为什么我们的项目里出现两个配置类继承WebMvcConfigurationSupport时,只有一个会生效.我在网上找了半天都是说结果的,没有人分析源码到底是为啥,博主准备讲解一下,希望可以帮到大家! ...

  8. C# 中的 is 真的是越来越强大,越来越语义化

    一:背景 1. 讲故事 最近发现 C#7 之后的 is 是越来越看不懂了,乍一看花里胡哨的,不过当我静下心来仔细研读,发现这 is 是越来越短小精悍,而且还特别语义化,那怎是一个爽字了得,这一篇就和大 ...

  9. 040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程

    040 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 02 while循环的执行流程 本文知识点:while循环的执行流程 三种循环结构中的第一种--wh ...

  10. 01 C语言基本介绍

    C语言特点 容易上手学习 结构化语言 执行效率高 处理的工作和活动偏底层 可以在多种计算机平台上编译(类似Java的跨平台) C语言历史 目前,C 语言是最广泛使用的系统程序设计语言之一 C 语言是最 ...