Go基础之--数组和切片

论坛 期权论坛     
选择匿名的用户   2021-6-1 22:26   381   0
<div class="blogpost-body" id="cnblogs_post_body">
<h2 id="toc_1">数组</h2>
<p><strong>数组的定义:</strong></p>
<p>数组是具有固定长度并拥有零个或者多个相同数据类型元素的序列</p>
<p><strong>定义一个数组的方法:</strong><br>var 变量名[len] type</p>
<p>例子:<br>var a[5] int //3个整数的数组<br>var a[5]string //3个字符串的数组</p>
<p>像上面这种定义方法,我们是指定了数组的长度,但是还有如下定义方法:<br>var a&#61;[...]int{1,2,3}<br>如果把数组的长度替换为...,那么数组的长度由初始化数组的元素个数决定</p>
<p>数组中的每个元素是通过索引来访问,索引是从0开始<br>例如 数组var a[5]int 获取第一个元素就是a[0],<br>获取数组的长度是通过len(a)</p>
<p>这里需要知道:数组的长度也是数组类型的一部分,所以要知道[3]int和[4]int是不同的数组类型</p>
<p>默认情况下一个新数组中的元素初始值为元素类型的零值<br>如一个证书类型的数组,默认值就是0</p>
<p><strong>初始化数组:</strong></p>
<p>有一下几种方法:<br>var a &#61; [5] int{1,2,3,4,5}<br>var a &#61; [5] int{1,2,3}<br>var a &#61; [...]int{1,2,3,4}<br>var a &#61; [5]string{1:&#34;go&#34;,3:&#34;python&#34;}</p>
<p><strong>关于数组的类型:</strong><br>值类型</p>
<p><strong>数组的遍历</strong></p>
<p>数组的遍历方法:<br>var a &#61; [3]int{1, 2, 3}<br>for i, v :&#61; range a {<!-- --><br>fmt.Printf(&#34;%d %d\n&#34;, i, v)<br>}<br>当然如果不需要索引也可以:<br>var a &#61; [3]int{1, 2, 3}<br>for _, v :&#61; range a {<!-- --><br>fmt.Printf(&#34;%d\n&#34;, v)<br>}</p>
<p><strong>二维数组</strong></p>
<p>var a[3][2]</p>
<p>其实二维数组可以通过excel表格理解,就是几行几列的问题,像上面的这个例子就是一个3行2列的二维数组。<br>关于二维数组的遍历,创建一个二维数组并循环赋值,然后循环打印内容<br>var c [3][2]int<br>for i :&#61; 0; i &lt; 3; i&#43;&#43; {<!-- --><br>for j :&#61; 0; j &lt; 2; j&#43;&#43; {<!-- --><br>c[i][j] &#61; rand.Intn(10)<br>}<br>}<br>for i :&#61; 0; i &lt; 3; i&#43;&#43; {<!-- --><br>for j :&#61; 0; j &lt; 2; j&#43;&#43; {<!-- --><br>fmt.Printf(&#34;%d &#34;, c[i][j])<br>}<br>fmt.Println()<br>}</p>
<p><strong>关于数组的比较</strong></p>
<p>如果两个数组的元素类型相同是可以相互比较的,例如数组a:&#61; [2]int{1,2}和数组b:&#61;[2]int{3,4}<br>因为同样都是int类型,所以可以通过&#61;&#61;来比较两个数组,看两边的元素是否完全相同,使用!&#61; 比较看两边的元素是否不同</p>
<p>通过下面的例子演示更加清晰:</p>
<div class="cnblogs_code">
  <pre class="blockcode">a :&#61; [2]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
b :</span>&#61; [...]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
c :</span>&#61; [2]<span style="color:#0000ff;">int</span>{3, 2<span style="color:#000000;">}
d :</span>&#61; [3]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
fmt.Println(a </span>&#61;&#61; b, a &#61;&#61; c, b &#61;&#61;<span style="color:#000000;"> c)
fmt.Println(a </span>&#61;&#61; d)</pre>
</div>
<p>上面的例子中第一个打印的结果是true,false,false,而当添加第二个打印的时候,就无法编译过去,因为两者是不能比较的</p>
<h2 id="toc_2">切片slice</h2>
<p><strong>定义</strong></p>
<p>slice 表示一个拥有相同类型元素的可变长的序列</p>
<p>定义一个slice其实和定义一个数组非常类似<br>var 变量名[]type<br>var b &#61; []int</p>
<p>和数组对比slice似乎就是一个没有长度的数组</p>
<p><strong>slice的初始化</strong><br>var a[5] int //这是定义一个数组<br>var b[]int &#61; a[0,2]<br>var b[]int &#61; a[0:5]<br>var b[]int &#61; a[:]<br>var b[]int &#61; a[:3]</p>
<p>var b[] int &#61; []int{1,2,3,4}</p>
<p>同样遍历切片和数组是一模一样的</p>
<p>通过把数组和slice对比我们其实可以发现,两者其实非常类似,当然两者也确实有着紧密的关系</p>
<p>slice的底层实现就是一个数组,通常我们会叫做slice的底层数组。<br>slice具有三个属性:指针,长度和容量,如下图</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-5cbfda6fba0af930256aa2b872cf22d2.png"></p>
<p>指针指向数组的第一个可以从slice中访问的元素,这个元素不一定是数组的第一个元素<br>长度是指slice中元素的个数,不能超过slice的容量<br>容量的大小是从slice的起始元素到底层数组的最后一个元素的个数<br>通过len和cap可以获取slice的长度和容量<br>通过下面例子理解:<br>var s &#61; [5]int{1, 2, 3, 4, 5}<br>var b &#61; s[2:3]<br>var c &#61; s[0:4]<br>现在问b的长度以及容量,c的长度以及容量<br>对比上面的定义其实很好明白<br>s 就好比slice的底层数组<br>而对于b这个slice来说他是从数组的第三个元
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP