详解go语言的array和slice 【二】

  上一篇  详解go语言的array和slice 【一】已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多。上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量,在操作新slice时,如果新slice的容量大于长度时,添加新元素依然后使源的相应元素改变。这一篇里我会讲解到如何避免这些问题,以及迭代、和做为方法参数方面的知识点。

slice的长度和容量设置为同一个值

  如果在创建新的slice时我们把他的长度和容量的值设置为样的值,那么在append新元素时,底层会创建一个新的array并把之前的值复制过去。这样就不会影响之前共同的底层array了。

    // 创建一个容量和长度均为6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}// 对slices1进行切片,长度为2容量为3slice2 := slice1[1:3:3]fmt.Println("cap", cap(slice2))fmt.Println("slice2", slice2)//修改一个共同指向的元素//两个slice的值都会修改slice2[0] = 11111fmt.Println("slice1", slice1)fmt.Println("slice2", slice2)// 增加一个元素slice2 = append(slice2, 55555)fmt.Println("slice1: ", slice1)fmt.Println("slice2: ", slice2)

  输出结果

cap 2
slice2 [23 10]
slice1 [5 11111 10 2 61 33]
slice2 [11111 10]
slice1:  [5 11111 10 2 61 33]
slice2:  [11111 10 55555]

  代码中的长度和容量是一样的,长度和容量的计算公式看我的上一篇博客。增加一个元素后,原来共同指向的底层数据是没有变的。因为slice2的底层array被重新赋值了。

迭代slice

  go语言内置一个关键字range用于迭代集合,当然他也可以迭代slice,也可以使用  _  来忽略我们不关心的元素,但是如果只关心index则不需这么写 for index,_ := range slice1。下在给出完整代码

    // 创建一个容量和长度均为6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}for index, value := range slice1 {fmt.Println("index: ", index, " value: ", value)}// 可以忽略我们不关心的元素// 只关心valuefor _, value := range slice1 {fmt.Println("value ", value)}// 只关心index, 可以不用 _for index := range slice1 {fmt.Println("index: ", index)}

 

   需要注意的是rang 迭代的value值并是一个复本,我们可以对比一下迭代的value和原slice内相应index下value的地址:

    // 创建一个容量和长度均为6的sliceslice1 := []int{5, 23, 10, 2, 61, 33}for index, value := range slice1 {fmt.Println("index: ", index, " value address : ", &value, " slice1 value address", &slice1[index])}

  输出结果

index:  0  value address :  0xc04204e088  slice1 value address 0xc04206a030
index:  1  value address :  0xc04204e088  slice1 value address 0xc04206a038
index:  2  value address :  0xc04204e088  slice1 value address 0xc04206a040
index:  3  value address :  0xc04204e088  slice1 value address 0xc04206a048
index:  4  value address :  0xc04204e088  slice1 value address 0xc04206a050
index:  5  value address :  0xc04204e088  slice1 value address 0xc04206a058

  slice1中value的地址是不断变化的。而迭代的value值的地址没有变化,这是因为value是一个变量,为次迭代的时候赋不同的值。我们把代码写成下面这样,你就清楚了

    var index, value intfor index, value = range slice1 {fmt.Println("index: ", index, &index, " value address : ", &value, " slice1 value address", &slice1[index])}

   除了使用rang 也可以使用传统的for循环来做迭代

    slice1 := []int{5, 23, 10, 2, 61, 33}for i, len := 1, len(slice1); i < len; i++ {fmt.Println("index: ", i, " value:", slice1[i])}

 

 slice作为方法参数

   由于slice的特殊结构,有一个指针指向一个数组

    s := make([]int, 2, 5)fmt.Println("len: ", len(s))fmt.Println("cap: ", cap(s))s = append(s, 2)s[0] = 12

 

  所以,slice做为方法的参数传递时,只会复制slice本身而不会复制slice底层的array.如果我们创建一个int类型有100万长度的slice ,把他传递给一个方法时,只需要复制24个字节就够了。指针需要8个,长度和容量都是8个。

const size int = 1000 * 1000func main() {slice0 := make([]int, size)fmt.Println("slice0 len: ", len(slice0), " cap :", cap(slice0))doSomeThing(slice0)
}func doSomeThing(s []int) {fmt.Println(len(s))
}

 

 

转载于:https://www.cnblogs.com/li-peng/p/7541554.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解Objective-C的meta-class

2019独角兽企业重金招聘Python工程师标准>>> 比较简单的一篇英文&#xff0c;重点是讲解meta-class。翻译下&#xff0c;加深理解。 原文标题&#xff1a;What is a meta-class in Objective-C? 原文地址&#xff1a;http://www.cocoawithlove.com/2010/01/what-is…

十倍程序员 | 使用 Source Generator 将 JSON 转换成 C# 类

前言有时候&#xff0c;我们需要将通过 WebAPI 接收 JSON 字符串转换成 C# 代码。Visual Studio 提供了一个功能菜单可以轻松实现&#xff1a;执行完成后&#xff0c;它会将生成的代码放在打开的的代码窗口中。但是&#xff0c;如果有多个 JSON 字符串需要转换&#xff0c;这个…

微软Microsoft Azure 机器学习工作室的案例之Image Classification using DenseNet

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;10分钟)Microsoft Azure Machine Learning Studio是微软强大的机器学习平台&#xff0c;在设计器中&#xff0c;微软内置了15个场景案例&#xff0c;但网上似乎没有对这15个案例深度刨析的分析资料&#xff0c;所以我…

音乐分类

代码&#xff1a; 1 import numpy as np2 from scipy import fft3 from scipy.io import wavfile4 from sklearn.linear_model import LogisticRegression5 import random6 """7 使用logistic regression处理音乐数据&#xff0c;音乐数据训练样本的获得是使…

不管对不对,先把闹钟关了再说

小榆提前关闭早上闹钟&#xff0c;几乎工作日的早晨都是被这魔怔的铃声给拉扯醒&#xff0c;无论有多么不愿还是痛苦&#xff0c;可对这闹钟也无可奈何&#xff0c;就算一时果断掐掉接下来是另一回麻烦事。最后一天&#xff0c;已经顾不得多少&#xff0c;没什么令人惧怕的人或…

pycharm(windows)安装及其设置中文菜单

pycharm&#xff08;windows&#xff09;安装及其设置中文菜单 1.下载 在官网&#xff08;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff09;进行下载 或者到百度云进行下载 专业版&#xff1a;链接&#xff1a;http://pan.baidu.com/s/1bSSRds 密码&…

Tomcat定义虚拟主机案例

Tomcat定义虚拟主机案例 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 一.准备环境 1>.创建web程序的根目录 [rootyinzhengjie ~]# mkdir -pv /home/yinzhengjie/data/www/webapps/ROOT mkdir: created direc…

将域名绑定到ip上,并实现访问不同二级子域名对应不同目录

一、将域名绑定到ip上1、环境介绍&#xff1a;阿里云服务器ESC&#xff08;美国硅谷&#xff09; 2、购买域名 3、备案 注&#xff1a;由于我买的是美国地区服务器&#xff0c;所以不用备案&#xff0c;如果买的国内服务器&#xff0c;这里需要添加一个备案操作。 4、域名实名认…

ABP vNext微服务架构详细教程(补充篇)——单层模板(中)

框架搭建2聚合服务这里我们将聚合服务命名为Domain.Core和基础服务层一致&#xff0c;我们先通过命令创建单层模板项目Domain.Core&#xff0c;这里我们删除wwwroot、Data、Entities、Localization、ObjectMapping文件夹及其所有子文件&#xff0c;并删除package.json文件和Ser…

谈一谈synchronized关键词

1.使用 java中的每一个对象都可以作为synchronized的锁进行代码同步&#xff0c;常见的形式 同步代码块锁是synchronized括号内的对象普通成员方法上&#xff0c;锁是当前的对象&#xff0c;synchronized(this)静态方法上&#xff0c;锁是当前类的Class对象2. 原理 synchronize…

系统学习redis之二——redis集群搭建

redis单点部署&#xff1a; 安装命令&#xff1a; # cd /usr/local/ # wget http://download.redis.io/releases/redis-4.0.1.tar.gz #下载安装包 # yum -y install gcc psmisc #安装依赖包 # tar xf redis-4.0.1.tar.gz # cd /usr/lo…

业务技术协同线上化的研发管理实战

摘要&#xff1a;2017年1月13日举办的【云栖计算之旅】线下沙龙第4期研发管理专场&#xff0c;阿里巴巴B2B事业群产品专家代平为大家带来了题为业务技术协同线上化的研发管理实战的演讲。本文主要从管理产品研发的理念开始谈起&#xff0c;着重说明了云效指挥部的六大步骤&…

Linux中写脚本,同时去开启我们自己设定的多个服务(含定时脚本实现)

场景介绍&#xff1a; 在Linux中&#xff0c;我们通常开启服务需要使用systemctl start 服务名 命令&#xff0c;这样&#xff0c;如果开启一个服务还好&#xff0c;但是如果同时开启多个服务&#xff0c;难免会感到麻烦&#xff0c;这时&#xff0c;我们可以自定义一个脚本&a…

负载均衡环境搭建实战之nginx和tomcat

Linux基本环境负载均衡的环境需要在linux下搭建完成&#xff0c;所以有一个基础的linux系统是必须的&#xff0c;这里建议大家按照http://edu.51cto.com/course/10209.html中的基础linux环境来安装&#xff0c;这样能少走弯路。JDK安装1、 下载对应版本的Java1.7&#xff0c;a)…

桌面应用如何判断win11操作系统

背景Windows 11 操作系统已经正式发布快有一年了&#xff0c;在 .Net 开发中&#xff0c;我们获取操作系统版本&#xff0c;经常使用 Environment.OSVersion.Version.Major 和 Minor&#xff08;6.1 Windows 7, 10.0 Windows 10&#xff09;&#xff0c;但是当 Win11 出现以后…

Nginx 网站定义自己的错误页面

场景&#xff1a; 为了给用户较好的交互和感官&#xff0c;我们通常需要对错误页面进行友好提示。 环境介绍&#xff1a; LNMP&#xff08;linux&#xff08;centos7.4&#xff09;Nginx Mysql5.6 php7.0&#xff09;实现&#xff1a; 这里&#xff0c;我直接对nginx的子配置文…

车辆调度

为什么80%的码农都做不了架构师&#xff1f;>>> 车辆调度系统 大体上分为4个部分吧 1.调度车辆&#xff1a;你调度的时候需要的车辆&#xff0c;方便给你运输啥的 2.调度任务&#xff1a;你为啥会调度车辆&#xff0c;肯定要有一个任务 3.客户&#xff1a;那这个…

Nginx 设置,设置已经解析的域名,在nginx中没有定义相应server时的默认访问

场景介绍&#xff1a; 因为业务需求&#xff0c;我们需要对域名进行解析&#xff0c;这里我对域名进行了如下解析但是&#xff0c;因为业务需求&#xff0c;我可能在nginx中只定义了kuman.xiaobudiu.top 和 www.xiaobudiu.top 的相应server的子配置文件&#xff0c;如图那么问题…

第一次作业--四则运算题目生成程序

功能简介&#xff1a; 1.获取用户所要生成算术的个数 2.随机生成算式和式子的答案 3.生成算式和答案的txt文件来保存算式和答案 思路&#xff1a; 生成里的运算数分为三个部分&#xff0c;整数&#xff0c;如果是分数就再分为分子和分母&#xff0c;然后为这三个部分创建数组&a…

ABP vNext微服务架构详细教程(补充篇)——单层模板(上)订正篇

简介在之前的《ABP vNext微服务架构详细教程》系列中&#xff0c;我们已经构建了完整的微服务架构实例&#xff0c;但是在开发过程中&#xff0c;我们会发现每个基础服务都包含10个类库&#xff0c;这是给予DDD四层架构下ABP的实现方案&#xff0c;但是实际使用中我们会发现&am…