Go语言基础一
Go
语言身世简介
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go
语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Go语言的第一个程序
我们使用的IDE
工具为GoLand
(没错,又是Jetbrains
家的产物,我是重度爱好者),在写Go
程序之前,我们首先得配置好Go
语言的开发环境,这里就不做赘述,相信凭借各位的能力,一定能够没问题
package main import "fmt" func main() { fmt.Println(123456) }
这里是Go
语言的第一个程序,我们把这个程序拆分下来细看一下
首先是package
,相信有语言基础的同学都能够明白这个是包的意思,我们导入的是main
的包,读者可以理解为一种约定俗成,没有main
的话,你的Go
程序会出现奇奇怪怪的问题
其次,是import
,这里指的是导入的意思,我们导入了fmt
这个库,经过求证,fmt
该库是用来格式化输入输出,也就是我们所说的java中的System.out.println();
或者是JavaScript中的console.log()
,这么一说,相信大家也不陌生
Go语言的数据类型
在介绍数据类型之前,想为读者介绍的是,Go语言是没有以分号结尾的这个习惯,而且是先声明var类型(一般情况下都是var类型的数据),紧接着声明变量名和数据类型
var name string var age int var sex bool
同时我们还加入了一种懒人写法,想到这里大家可能就想到了结构体,将同种声明含义的变量放到一个大括号里面,没错,在Go语言中也能过实现这一操作
var ( name string age int sex bool pwd float32 )
这么一看,似乎下面的方法要高效的多
Go语言匿名变量
很多小伙伴第一次看到这个匿名变量,有点发懵。其实可以这么理解,匿名变量顾名思义,就是不想让人知道,在Go
语言中我们可以用_
来代替,要注意的是:匿名变量不占用命名空间,不会分配内存
func foo() (int, string) { return 10, "Q1mi" } func main() { x, _ := foo() _, y := foo() fmt.Println("x=", x) fmt.Println("y=", y) }
在这个代码块中我们可以看到,我们定义了一个foo
方法用于保存相关参数,第一个参数类型为int
,第二个参数类型为string
;紧接着我们在main
方法中,使用匿名变量去调用foo
方法,为了体现差异,我们进行二次方法调用,最后输出的结果显而易见(写上方的demo
是为了验证匿名变量的使用)
Go语言的数据类型
iota
是go
语言的常量计数器,它只能在常量的表达式中使用(作者觉得这一点非常的人性化,因为以往在java
中,这一功能需要声明一个变量+for循环才能实现,go语言yyds! )
贴一张从Google找的图片,请读者自行查阅数据类型及其所对应的范围
类型 | 长度(字节) | 默认值 | 说明 |
bool | 1 | false | |
byte | 1 | 0 | uint8 |
rune | 4 | 0 | Unicode Code Point, int32 |
int, uint | 4或8 | 0 | 32 或 64 位 |
int8, uint8 | 1 | 0 | -128 ~ 127, 0 ~ 255,byte是uint8 的别名 |
int16, uint16 | 2 | 0 | -32768 ~ 32767, 0 ~ 65535 |
int32, uint32 | 4 | 0 | -21亿~ 21亿, 0 ~ 42亿,rune是int32 的别名 |
int64, uint64 | 8 | 0 | |
float32 | 4 | 0.0 | |
float64 | 8 | 0.0 | |
complex64 | 8 | ||
complex128 | 16 | ||
uintptr | 4或8 | 以存储指针的 uint32 或 uint64 整数 | |
array | 值类型 | ||
struct | 值类型 | ||
string | “” | UTF-8 字符串 | |
slice | nil | 引用类型 | |
map | nil | 引用类型 | |
channel | nil | 引用类型 | |
interface | nil | 接口 | |
function | nil | 函数 |
至于读者想问的字符串转化、转义字符这些问题,作者并没有给出详细的介绍,因为这些相关介绍读者都是能够直接在网上查阅到的,在此不作赘述
Go语言中的数组
今天作者花了大量的时间来学习Go
语言,其中有一半的时间都花在了数组上面
首先我们来看Go
语言文档中对于数组的定义
1. 数组:是同一种数据类型的固定长度的序列。 2. 数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。 3. 长度是数组类型的一部分,因此,var a[5] int和var a[10]int是不同的类型。 4. 数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1
很多读者反应:你给我们看这些也没用啊,没有实际的例子我们看不懂!!!
一维数组
func main() { a := [3]int{1, 2} b := [...]int{1, 2, 3, 4} c := [5]int{2: 100, 4: 100} d := [2]struct { name string age uint8 }{ {"user1", 10}, {"user2", 20}, } fmt.Println(a, b, c, d) }
对于上方代码,我们做出如下的详细解析
- 首先我们可以看到
a
变量开拓了一个数组长度为3的变量,但是只声明了2个变量,还有一个变量未进行变量初始化,在Go语言中,我们将未定义的数组的初始化变量为0 - 其次我们可以看到
b
变量开拓了一个任意长度的数组,同时进行相应的赋值操作,在Go语言中,如果我们不确定数组的长度,我们就可以使用...
来代替数组的长度,类似于一种动态数组 - 紧接着我们可以看到
c
变量比较特殊,在变量里面声明了相关数值,c
数组里面的第一个2是代表从第三个开始输出100,4同理 - 最后数组d采用结构体的形式,在结构体之前声明该结构体所需的容量
这里就有小伙伴要问了,能不能使用...
来代替结构体前面的数字,作者给出的答复是:可以但没必要;因为你下面的括号里面要声明具体的数据类型所对应的值,你既然能够知道具体有几个数来对应数据类型,又何必使用...
来代替呢?
二维数组
func main() { a := [2][3]int{{1, 2, 3}, {4, 5, 6}} b := [...][2]int{{1, 1}, {2, 2}, {3, 3}} fmt.Println(arr0, arr1) fmt.Println(a, b) }
对于上方代码,我们做出如下的详细解析
- 首先我们可以看到
a
数组定义了一个长2宽3的数组,第一个数组里面存放的是123,第二个数组里面存放的是456,相信这一步对绝大部分读者来说并无异议 - 其次,我们可以看到的是,在b数组中,我们使用
...
来自定义数组长度,这一点有效的解决了动态数组容量的问题。值得一提的是,在二维数组里面,我们不能将第二个维度的数组设置成...
,否则数组的长度及定义就会出现歧义,具体原因读者自行想象
今日总结
今天我们主要学习了Go
语言的数据类型及数组,在数据类型中,我们了解到了匿名变量的使用方法,明白了Go
语言有哪些数据类型;在数组中,我们了解到了一维数组和二维数组,同时也进一步加深了我们对...
的使用概念,读者可以通过本篇文章进行消化并加以demo进行练习~