撸起袖子加油干 golang入坑系列
还是提醒一下,里面有段子,不都是技术。 冲着技术来的,慢走不送。没有版权,但可以给我发邮件(ztao8607@gmail.com)
在我的发小朋友中,终于最后一位打光棍的要结婚了。 说实话,真心不容易。相亲七八次,女方年龄上至32,下至23。跨度之大,范围之广,在我的发小界相当罕见。 扪心自问,程序员都怎么了?为什么找个女朋友结婚会如此艰难。 是coder们不解风情?还是被岛国妹子蒙蔽了心灵?若说木讷,内向。那恐怕是对码农们最大的误解了,在他们一副不愿说话的面具之下都暗藏着一颗汹涌澎湃的内心,时时刻刻在迸发着灵感。但至于这份灵感几分用于妹子身上,那就尚未可知了。也见过舌尖口利,口若悬河的屌丝,但这种状态经常出现在与人争论技术问题之时,如若对面站的是一个萌妹子,恐怕再多的hello world也要return回肚子里面。所以,我这位发小找不到另一半,的确是有原因的。 还好,经过全方位不歇的努力,终于找到了一个懂得撬开这位愣头青口舌的妹子。所以,借此祝愿二位喜结良缘,白头到老,撸起袖子加油干!
书接上文,继续来聊Golang中常见的数据类型。
在上篇中,说到了String。本节来看数组Array。若你还有印象,想必在大学课堂之上肯定会有一门<数据结构>的课程。这门课程应该是计算机专业的奠基之课,学好了这门课,即便你不会写代码也不耽误你找份好工作。如果又学好了算法,即便你不会写代码,也不耽误你去BAT实习。
而数组就是一种常见的数据结构。 这里没法从数据结构的角度来讲数组,因为我自认对此并不精通,讲不好不如不讲。 有兴趣,建议翻看大学数据结构的教材,看懂那本就够了。
Golang的数组从数据结构的角度来说,和其它语言没什么区别。都是链式存储数据,存储相同类型的数据。数组下标同样从0开始计数,通过[]来顺序访问。例如:
intList[0] intList[1] ... intList[99]
声明数组最常用的方法是下面这种:
var arrayname[SIZE] type
这是最常用的单维数组(只有一个维度的数组),相对应的会存在多维数组,例如二维数组。二维数组的每一项都是另外一个数组,因此可以理解成存放数组的数组。
当使用上面语句声明变量时,Size必须是一个大于零的整数常量,而类型可以是任何合法的数据类型(包括内置的基本类型或者自定义的数据类型)。
例如,我们声明一个长度为10的整型数组:
var intList[10] int
在<准备冲锋>一节中,可以看到变量声明之外,如果是基本数据类型的变量,golang会自动完成初始化。 那数组呢?golang会不会自动完成初始化。你可以自己动手写段代码试一下。如果不想写,直接拿走下面的代码:
package main
import (
"fmt"
)
func main() {
var intList [10]int
fmt.Println(intList[1])
fmt.Println(intList[9])
}
任意访问两个元素,结果都是0. 换成其它类型,看看结果。实际结果表明,如果是基本数据类型,golang同样会对数组元素进行初始化。在上例当中,所有元素都初始化成了0. 如果想初始化其它数据怎么办?Easy,使用下面的语法:
var name = [SIZE]type{ value, value .... }
从语法上面来看,就是一个二合一。 首先声明数组,然后对数组中每个元素进行赋值,借此完成数据初始化的目的。比如下面:
var intList = [5]int{1,2,3,4,5}
在运行一下代码,看看结果:
package main
import (
"fmt"
)
func main() {
var intList = [5]int{1,2,3,4,5}
fmt.Println(intList[1])
fmt.Println(intList[4])
}
这种方式是常用的初始化方式,再说一点不太常用,但面试的时候容易被人提及的(正常情况下,使用概率低于10%).
隐式长度
var intList = []int{1,3,4,5,6}
事先不声明长度,依靠后面初始值的长度来确定数组长度,没啥可说的,技巧而已。
比这个刚常用的是:
var intList []int
intList = append(intList,10)
但此时intList已经变成切片类型了。 切片和数组还是有所不同的,在下节会讲到切片类型,这里只剧透一下。
数组初始化完成之后,在后面的程序中都可以直接使用了。 而使用的方式,就是通过下标依次取出进行赋值或者取值操作。例如:
// 直接拷贝个源代码,用来说明问题
package main
import "fmt"
func main() {
var n [10]int
var i,j int
for i = 0; i < 10; i++ {
n[i] = i + 100
}
for j = 0; j < 10; j++ {
fmt.Printf("Element[%d] = %d\n", j, n[j] )
}
}
Golang最基本的数组用法就是这些,在开始的时候说过,最常用的是一维数组,多维数组使用不算太多(尤其超过二维的数组,用之甚少),因此使用一点篇幅来说一下多维数组的使用。
首先是多维数组的声明,看着负责,其实不难:
var name [SIZE1][SIZE2][SIZE3]....type
既然是数组,就要遵循数组的规范,无论是多维数组还是单维数组,其中的元素必须是同一种数据类型,所以可以看到最后只有一种type。
而上面多个SIZE的个数表示的是维度,上面有三个SIZE表示的是三维(例如经常说的长高宽,如果你非要理解成那个三维,随便你,也没错)。如果只有[SIZE1][SIZE2]就表示是二维。
多维数组的初始化和一维一样(其实我们可以将多维数组降维成一维),看下面:
var a = [3][4]int{
{0, 1, 2, 3} ,
{4, 5, 6, 7} ,
{8, 9, 10, 11}
}
a是一个二维数组,在第一维上面有三个元素,每个元素是一个数组(这个数组是一个保存四个元素的单维数组)。所以这个数组的初始化,就是同时完成多个数组的初始化。
多维数组的访问,仍然遵循下标访问的规则。 例如需要取出上面数组中的8,那就是 a[2][0]。 因为8所在的数组是a数组的第三个元素,所以先取出a[2],而这个a[2]是一个数组,8是这个数组的第一个元素,所以a[2][0]就是8。
熟能生巧,唯手熟尔。 所以遇到不明白的地方,多写几段代码看看效果。
最后问个小问题,让你来回答。
提问:[5]int 和 []int 是不是同一种数据类型
回答: XXXX
还是那句话,写段代码验证一下。
package main
import "fmt"
func main() {
var s []int
s = append(s, 10)
printArray(s)
}
func printArray(s []int) {
fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s)
}
如果把printArray的参数由[]int 替换成 [5]int,看看什么效果。 恩,报错。 会提示你类型不一致。这点是刚开始写golang代码时容易混淆的地方,[5]int是数组类型,而[]int则是切片类型。因此会报错。
在实际编程经验中,数组使用率反而不如切片高。这又是为何呢? 还不点个star,订阅下一节。
撸起袖子加油干 golang入坑系列的更多相关文章
- 初生牛犊不怕虎 golang入坑系列
读前必读,下面所有内容都是来自这里. 放到这里的目的,就是为了比对一下,哪里的读者多.平心而论,同样的Markdown,博客园排版真心X看,怎么瞅怎么X看.(X := '难' || X :='耐' | ...
- 入坑第二式 golang入坑系列
史前必读: 这是入坑系列的第二式,如果错过了第一式,可以去gitbook( https://andy-zhangtao.gitbooks.io/golang/content/ )点个回放,看个重播.因 ...
- 维多利亚的秘密 golang入坑系列
原文在gitbook,字字原创,版权没有,转载随意. 在写本文的前一天,2017维密在上海开始了. 为了纪念屌丝界的盛世,特为本节起名维多利亚的秘密.现在的社会,要想出名只有抓眼球.所以写份技术文章, ...
- 崩溃 golang入坑系列
早上(11.30)收到邮件,Vultr东京机房网络故障.当时搭建SS时,考虑到了机房故障.所以特意分出了日本和香港两条线路.但千算万算,忘记数据库还在东京机房中. 现在网络故障,SS服务器无法读取数据 ...
- 准备冲锋 golang入坑系列
史前摘要: 本来想写读前必读,但连续几篇博文都写读前必读,感觉就没有了新意. 所以换成史前摘要,反正是一个意思. 此摘要的目的仍然是提醒点击而来的同学,本系列最新文章在这里.放到博客园的目的是为了方便 ...
- 坐忘峰 golang入坑系列
读前必读: 本文写于20日,首发于gitbook. 迟到的是日期,没变的是内容. 点击进入 https://andy-zhangtao.gitbooks.io/golang/content/ 可以看到 ...
- 分水岭 golang入坑系列
第三式开篇语有些负面, 所以这里就不贴了.有兴趣的自己可以去看看 https://andy-zhangtao.gitbooks.io/golang/content/ .怒发冲冠,意气之作.看完就完了, ...
- 乐呵乐呵得了 golang入坑系列
开场就有料,今天返回去看了看以前的文章,轻松指数有点下降趋势.一琢磨,这不是我的风格呀.一反思,合着是这段时间,脑子里杂七杂八的杂事有点多,事情一多,就忘了快乐.古话说得好:愁也一天,乐也一天,只要还 ...
- 来自朝鲜的问候 golang入坑系列
鸿渐于陆 本想着写满十八式,但按照目前的进度来看,是很难凑够十八式了.所以还是那句话,量力而行,适可而止.能写多少就写多少,我没法保证看完这本golang脱口秀,一定能成为golang大拿.但入了门, ...
随机推荐
- 测试String.Format中的Format参数
DateTime datetime = DateTime.Now; Console.WriteLine(String.Format("{0:d}", datetime)); // ...
- win10 uwp 自定义控件 SplitViewItem
本文主要是因为汉堡菜单里面列出的菜单很多重复的图标和文字,我把它作为控件,因为是随便写,可能存在错误,如果发现了,请和我说或关掉浏览器,请不要发不良言论. 我们使用汉堡菜单,经常需要一个 需要一个图标 ...
- JavaScript正则表达式实例汇总
本文会持续更新 -------------------------------------------------------------------------------------------- ...
- Eratosthenes,筛法求素数
//筛法求区间[0,n]的所有素数,v为素数表 //v[i]==0,i为素数 void f(int n) { int m=sqrt(n+0.5); memset(v,,sizeof(v)); ;i&l ...
- Httpd2.2常见配置及功能
Httpd 2.2常见配置 要配置http服务的配置文件,先备份一下,养成良好习惯,如果误操作导致http服务起不来,就可以将备份的主配置文件重新覆盖一下 httpd配置文件的组成:有三大部分组成,其 ...
- <Mastering KVM Virtualization>:第四章 使用libvirt创建你的第一台虚拟机
在第3章<搭建独立的KVM虚拟化>中,你安装并启动了libvirtd服务.你还引入了帮助你管理虚拟机的libvirt管理工具virt-manager和virsh. 相较于命令行,新用户总是 ...
- Windows下Mysql5.7开启binlog步骤及注意事项
1.查看是否开启了binlog:show binary logs; 默认情况下是不开启的. 2.开启binlog:修改mysql的配置文件my.ini.添加如下配置: 该文件默认不允许修改,需要右键“ ...
- 我的第一个python web开发框架(13)——工具函数包说明(四)
string_helper.py是字符串操作包,主要对字符串进行检查.过滤和截取等处理. #!/usr/bin/evn python # coding=utf-8 import re def chec ...
- Oracle:sqlplus前缀显示当前用户
第一步:进入SQLPLUS的按照目录,cd $ORACLE_HOME/sqlplus/admin 第二步:查找ll vi glogin.sql 第三步:插入 命令行模式,Go, set sq ...
- Python数据库查询之组合条件查询-F&Q查询
F查询(取字段的值) 关于查询我们知道有filter( ) ,values( ) , get( ) ,exclude( ) ,如果是聚合分组,还会用到aggregate和annotate,甚至还有万能 ...