go int 转切片_「快学 Go 语言」第 4 课——低调的数组

f273f46730a02baec9a22f722bee8d31.png

数组就是一篇连续的内存,几乎所有的计算机语言都有数组,只不过 Go 语言里面的数组其实并不常用,这是因为数组是定长的静态的,一旦定义好长度就无法更改,而且不同长度的数组属于不同的类型,之间不能相互转换相互赋值,用起来多有不方便之处。

切片是动态的数组,是可以扩充内容增加长度的数组。当长度不变时,它用起来就和普通数组一样。当长度不同时,它们也属于相同的类型,之间可以相互赋值。切片的便捷性让数组的绝大多数应用领域都广泛地被取代了。

不过也不可以小瞧数组,在切片的底层实现中,数组是切片的基石,是切片的特殊语法隐藏了内部的细节,让用户不能直接看到内部隐藏的数组。切片不过是数组的一个包装,给顽固的数组装上了灵活的翅膀,让石头也可以展翅飞翔。

仅仅是上面纯文字的说明,读者肯定会感觉很懵。下面让我们来看具体的实例。

数组变量的定义

我们先试一下只申明类型,不赋初值。这时编译器会给数组默认赋上「零值」。数组的零值就是所有内部元素的零值。

package mainimport "fmt"func main() {var a [9]intfmt.Println(a)}------------[0 0 0 0 0 0 0 0 0]复制代码

下面我们看看另外三种变量定义的形式, 效果都是一样的

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}c := [8]int{1, 2, 3, 4, 5, 6, 7, 8}fmt.Println(a)fmt.Println(b)fmt.Println(c)}---------------------[1 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9 10][1 2 3 4 5 6 7 8]复制代码

数组的访问

接下来我们使用下标来简单操作一下数组,这个数组里存的是数字的平方值

package mainimport "fmt"func main() {var squares [9]intfor i := 0; i < len(squares); i++ {squares[i] = (i + 1) * (i + 1)}fmt.Println(squares)}--------------------[1 4 9 16 25 36 49 64 81]复制代码

数组的下标越界检查(高阶知识)

上面的代码中我们注意到可以使用内置函数 len() 来直接获取数组的长度。数组的长度是编译期确定的,当我们使用 len() 函数访问数组的长度属性时,编译器在背后偷偷把它替换成了整数值。

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}a[101] = 255fmt.Println(a)}-----./main.go:7:3: invalid array index 101 (out of bounds for 5-element array)复制代码

上面的代码运行结果说明了 Go 语言会对数组访问下标越界进行编译器检查。有一个重要的问题是,如果下标是一个变量,Go 是如何检查下标越界呢?变量需要在运行时才可以决定是否越界,Go 是如何办到的呢?

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}var b = 101a[b] = 255fmt.Println(a)}------------panic: runtime error: index out of rangegoroutine 1 [running]:main.main()/Users/qianwp/go/src/github.com/pyloque/practice/main.go:8 +0x3dexit status 2复制代码

答案是 Go 会在编译后的代码中插入下标越界检查的逻辑,所以数组的下标访问效率是要打折扣的,比不得 C 语言的数组访问性能。

数组赋值

同样的子元素类型并且是同样长度的数组才可以相互赋值,否则就是不同的数组类型,不能赋值。数组的赋值本质上是一种浅拷贝操作,赋值的两个数组变量的值不会共享。

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [9]intb = aa[0] = 12345fmt.Println(a)fmt.Println(b)}--------------------------[12345 2 3 4 5 6 7 8 9][1 2 3 4 5 6 7 8 9]复制代码

从上面代码的运行结果中可以看出赋值后两个数组并没有共享内部元素。如果数组的长度很大,那么拷贝操作是有一定的开销的,使用的时候一定需要注意。下面我们尝试使用不同长度的数组赋值会有什么结果

package mainimport "fmt"func main() {var a = [9]int{1, 2, 3, 4, 5, 6, 7, 8, 9}var b [10]intb = afmt.Println(b)}--------------------------./main.go:8:4: cannot use a (type [9]int) as type [10]int in assignment复制代码

可以看出不同长度的数组之间赋值是禁止的,因为它们属于不同的类型。

数组的遍历

数组除了可以使用下标进行遍历之外,还可以使用 range 关键字来遍历,range 遍历提供了下面两种形式。

package mainimport "fmt"func main() {var a = [5]int{1,2,3,4,5}for index := range a {        fmt.Println(index, a[index])    }    for index, value := range a {fmt.Println(index, value)}}------------0 11 22 33 44 50 11 22 33 44 5复制代码

考虑到切片的内容太多,我们将独立一节专门讲解切片,下一节将是 Go 语言的极有价值的一节,读者一定要努力搞清楚每一个细节。

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

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

相关文章

走向REST:将Tomcat与Spring和JAX-RS嵌入(Apache CXF)

这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器&#xff1a;它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是&#xff0c;嵌入最新的Apache Tomcat 7非常容易&#xff0c;因此现在让我展示一下。 我不会重复完整的上一篇文章 &#xff0c;因为除了…

移动端下,点击a标签背景高亮问题的解决方法

在制作某个移动端项目的时候&#xff0c;发现当我们点击链接&#xff0c;input标签或者div盒子的时候&#xff0c;整个标签会出现颜色块并会闪烁一下&#xff0c;不仅影响美观&#xff0c;而且会极大降低了用户体验。  解决方案&#xff1a;-webkit-tap-highlight-color: tra…

Sublime Text 3 Mac常用快捷键与注意事项

大多数情况下容易忘记的快捷键&#xff0c;在此整理了一下。 编辑快捷键&#xff1a;cmd L&#xff1a;选择行&#xff08;重复按下将下一行加入选择&#xff09;&#xff1b;cmd D&#xff1a;选择词&#xff08;重复按下时多重选择相同的词进行多重编辑&#xff09;&#xff…

Python 基础知识整理-2

条件语句  if else 循环语句  while  for 循环之break continue break语句用来终止循环语句&#xff0c;即循环条件没有False条件或者序列还没被完全递归完&#xff0c;也会停止执行循环语句。 break语句用在while和for循环中。 continue 语句用来告诉Python跳过当前循…

js实现oss批量下载文件_js下载文件到本地各种方法总结

一、此方法火狐有些版本是不支持的window.location.href https://*****.oss-cn-**.aliyuncs.com/*********;二、为了解决火狐有些版本不支持,可以改成这种方式window.locationhttps://*****.oss-cn-**.aliyuncs.com/*********;三、该方法IE和火狐都可以,url表示要下载的文件路径…

Couchbase 101:从Java应用程序创建视图(MapReduce)

使用Couchbase 2.0开发新应用程序时&#xff0c;有时需要从代码中动态创建视图。 例如&#xff0c;在安装应用程序&#xff0c;编写一些测试时&#xff0c;可能会需要此方法&#xff1b;或者&#xff0c;在构建框架时&#xff0c;您也可以使用它&#xff0c;并希望动态创建视图…

函数的参数详解

# 函数的参数定义函数的时候&#xff0c;我们把参数的名字和位置确定下来&#xff0c;函数的接口定义就算完成了。 对于函数的调用者来说&#xff0c;只需要知道如何传递正确的参数&#xff0c;以及函数将返回什么样的值就够了 函数内政部的复杂逻辑被封装起来&#xff0c;调用…

gRPC之grpcurl

1、grpcurl grpcurl项目地址 &#xff1a;https://github.com/fullstorydev/grpcurl 一般情况下测试 gRPC 服务&#xff0c;都是通过客户端来直接请求服务端。如果客户端还没准备好的话&#xff0c;也可以使用 BloomRPC (https://appimage.github.io/BloomRPC/)这样的 GUI 客…

算法初步——two pointers

什么是 two pointers   以一个例子引入&#xff1a;给定一个递增的正整数序列和一个正整数 M&#xff0c;求序列中的两个不同位置的数 a 和 b&#xff0c;使得它们的和恰好为 M&#xff0c;输出所有满足条件的方案。 本题的一个最直观的想法是&#xff0c;使用二重循环枚举序…

H5 _拖放使用

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>拖放API</title>6 <style>7 [iddragme]{8 width: 100px;9 height: 100px; 10 …

从XaaS到Java EE – 2012年哪一种该死的云最适合我?

您是否曾经想过要让Java EE在某个地方启动和运行需要什么&#xff1f; 是的 多年。 从托管我自己的主机开始&#xff0c;转到一些托管产品 &#xff0c;最后偶然发现了PaaS运动。 老实说&#xff0c;我并没有太认真。 我只是想把我的东西放到某个地方&#xff0c;而不在乎解决…

正方体最快最简单画_素描新手入门第一幅画可不只是“正方体”

很多素描教程都把正方体作为入门第一幅画学习内容。这种现象也成了约定俗成的规矩但是&#xff0c;学过画画的人大概都知道有很多人画了多年石膏几何形、静物、人头像甚至半身像全身像。到最后落得只会画这些学过的东西。这就说明学习出了问题。绘画练习一定要弄清楚每个物体练…

重写Alert和confirm方法去除地址显示

//重写alert方法&#xff0c;去掉地址显示window.alertfunction(name){var iframedocument.createElement("IFRAME");iframe.style.display"none";iframe.setAttribute("src",data:text/plain,); document.documentElement.appendChild(iframe);…

VS2015配置内核WDK7600环境,32位下.

VS2015配置内核WDK7600环境,32位下. 学习内核驱动的编写,就要会配置环境.不然总是用记事本编写.比较不方便. 环境配置如下. 1.首先下载WDK7600, 课堂资料代码中已经上传.链接&#xff1a;https://pan.baidu.com/s/1o9PjpUU 密码&#xff1a;k5sp 2.VS2015下载. 这个网络上有很多…

Camel 2.11 –具有URL重写功能的HTTP代理路由

在即将发布的Apache Camel 2.11版本中&#xff0c;我最近添加了对将自定义url重写实现插入基于HTTP的路由&#xff08;http&#xff0c;http4&#xff0c;jetty&#xff09;的支持。 当您使用骆驼代理/桥接HTTP路由时&#xff0c;这使人们可以控制url映射。 例如&#xff0c;假…

我的改进版2048(1)

&#xff08;假设有谁想要这个软件的话&#xff0c;在评论中留一个邮箱吧。&#xff09; 前几天好几次看到有朋友晒出玩2048刷高分的截图。我就想我能不能也做一个2048呢&#xff1f;细致想了想2048游戏的规律&#xff0c;发现事实上逻辑上非常easy&#xff0c;也不用研究什么算…

什么是 HTML5?

HTML5 是下一代的 HTML。 什么是 HTML5&#xff1f; HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。 HTML 的上一个版本诞生于 1999 年。自从那以后&#xff0c;Web 世界已经经历了巨变。 HTML5 仍处于完善之中。然而&#xff0c;大部分现代浏览器已经具备了某些 HTML5 支…

涉及CDI和JSF的过期对话的定制错误页面

自上次写博客以来已经有一段时间了。 我一直在考虑写一些技术博客&#xff0c;但最终却忙于其他事情。 上周&#xff0c;在Coderanch论坛上进行了非常有趣的讨论。 甚至更有趣&#xff0c;因为它涉及JBoss。 熟悉Java EE Web应用程序的开发人员会知道&#xff0c;Web应用程序部…

2020年市场最缺什么_2020年聚合氯化铝市场评述

2020年聚合氯化铝市场评述一、行情概述&#xff1a;今年聚合氯化铝价格整体呈下滑趋势&#xff0c;接近年底价格才有小幅反弹。但不同时期价格有小幅起伏&#xff0c;主要受疫情影响&#xff0c;在下游需求不佳的影响下价格出现下滑。1月受疫情影响&#xff0c;前期停产企业短期…

通过反射来将一个类的内容转换到另外一个类里

主函数&#xff1a; import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.serializer.ValueFilter;import com.google.common.base.Preconditions; import java.lang.reflect.Field;import java.lang.reflect.Modifier; public class leijun {public static void ma…