<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=[...]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 = [5] int{1,2,3,4,5}<br>var a = [5] int{1,2,3}<br>var a = [...]int{1,2,3,4}<br>var a = [5]string{1:"go",3:"python"}</p>
<p><strong>关于数组的类型:</strong><br>值类型</p>
<p><strong>数组的遍历</strong></p>
<p>数组的遍历方法:<br>var a = [3]int{1, 2, 3}<br>for i, v := range a {<!-- --><br>fmt.Printf("%d %d\n", i, v)<br>}<br>当然如果不需要索引也可以:<br>var a = [3]int{1, 2, 3}<br>for _, v := range a {<!-- --><br>fmt.Printf("%d\n", 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 := 0; i < 3; i++ {<!-- --><br>for j := 0; j < 2; j++ {<!-- --><br>c[i][j] = rand.Intn(10)<br>}<br>}<br>for i := 0; i < 3; i++ {<!-- --><br>for j := 0; j < 2; j++ {<!-- --><br>fmt.Printf("%d ", c[i][j])<br>}<br>fmt.Println()<br>}</p>
<p><strong>关于数组的比较</strong></p>
<p>如果两个数组的元素类型相同是可以相互比较的,例如数组a:= [2]int{1,2}和数组b:=[2]int{3,4}<br>因为同样都是int类型,所以可以通过==来比较两个数组,看两边的元素是否完全相同,使用!= 比较看两边的元素是否不同</p>
<p>通过下面的例子演示更加清晰:</p>
<div class="cnblogs_code">
<pre class="blockcode">a := [2]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
b :</span>= [...]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
c :</span>= [2]<span style="color:#0000ff;">int</span>{3, 2<span style="color:#000000;">}
d :</span>= [3]<span style="color:#0000ff;">int</span>{1, 2<span style="color:#000000;">}
fmt.Println(a </span>== b, a == c, b ==<span style="color:#000000;"> c)
fmt.Println(a </span>== 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 = []int</p>
<p>和数组对比slice似乎就是一个没有长度的数组</p>
<p><strong>slice的初始化</strong><br>var a[5] int //这是定义一个数组<br>var b[]int = a[0,2]<br>var b[]int = a[0:5]<br>var b[]int = a[:]<br>var b[]int = a[:3]</p>
<p>var b[] int = []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 = [5]int{1, 2, 3, 4, 5}<br>var b = s[2:3]<br>var c = s[0:4]<br>现在问b的长度以及容量,c的长度以及容量<br>对比上面的定义其实很好明白<br>s 就好比slice的底层数组<br>而对于b这个slice来说他是从数组的第三个元 |
|