Go 语言入门--Go语言基础语法 Part 1
一、前言
这是我写的第一个博客,用来记录我的学习历程,不知道是否可以帮助到学习go语言的人,写的不好轻喷
二、环境的搭建
1.Go语言的下载
在学习Go语言之前,我们首先要先下载go语言,在下面的的网站可以进行对应的下载
2.Go语言的环境配置
为了方便大家进行对应的配置,我直接把对应的视频链接放在下面
配置 Go 语言开发环境,可以选择安装 VS Code(or Goland ) ,VS Code则需安装 Go 插件
(3.在青训营中学习的好处)
(当然在青训营中,我们会有更方便的配置,掘进的AI练中学可以跳过环境的配置,直接进行代码的实操,不仅会有配套的代码,而且还可以根据课上的内容进行自己的改编,用于验证自己的猜想)
三、基础语法
1.变量
go语言是一门强类型语言,每一个变量都有对应的类型,在go语言中,常用的变量有:整型,字符串,布尔值等等,但比较方便的是,声明变量时,一般会自动判断变量类型,如果需要的话,才会在变量名后加对应的变量类型,以下是go语言的声明方式:
a.直接定义变量,并对变量进行初始化
var name = "xiaoming";
这种方法会自动将name判定为字符串类型
var a,b int = 3,4
这种方法会声明两个int型的变量a和b并进行分别赋值
b.只定义变量,并且会有变量类型
var e float32
这个就是定义了一个单精度浮点数(32位浮点数),如果要定义双精度浮点数,就是float64,这些数据类型的细分之后在详细整理
c.自动推导类型
不用定义的符号,直接进行初始化不用定义的符号,直接进行初始化
f := a+"ooa"
这种情况会自动推导变量的类型,并且反应出,在go语言中是可以支持字符串的之间拼接的
d.批量声明
我们可以直接进行多个变量声明
var(
name string
age int
)
name = "xiaoming"
age = 18
2.if-else
go语言的if语句和c语言很像,但是没有括号,并且无论怎样,条件之后都需要加大括号
if num:=9, num < 0{
fmt.println("num < 0")
}else if num < 10 {
fmt.println("num < 10")
}else{
fmt.println("num > 10")
}
3.循环
go语言只有一个循环,就是for循环,没有while和do-while循环,但是可以通过for循环实现相似的效果
for i:=1; i < 3; i++{
......
}
num := 1
for num<3{
num+=1
}
for{
num++
break
}
for循环可以缺少三条语句中的任何语句,通过这个方式,可以做到很多效果,写法上可以参考c和c++
4.switch语句
go语言的switch语句和c和c++,但是条件判断不需要括号,而且最方便的一点是,我们不需要在每一个case后面加break了,go语言会在判断执行到对应语句后直接跳出switch语句。
相比于c和c++,go语言中的switch语句功能更加强大,可以使用任何的变量类型,甚至可以取代if-else语句。你可以在switch语句后不加任何变量,仅仅在case后面加上条件的判断,作为类似if-else的条件语句
i := 1;
switch i {
case 1:
fmt.println("1")
case 2:
fmt.println("2")
default:
fmt.println("null");
}
//或者是用switch进行判断
switch {
case i < 0:
fmt.println("i < 0")
case i > 0:
fmt.println("i > 0")
default:
fmt.println("i = 0")
}
这样写的好处:代码比写if-else逻辑更加清晰
5.数组
简单来说,数组是一个有编号的固定长度的元素序列,go语言中的数据定义和c与c++的又有些不一样,它的元素类型是后置的,不如说go语言的元素类型都是后置的。
//第一种,直接定义数组
var a[5] int
a[0] = 1 ......
var b[2][3] int
//初始化省略(就是简单的for循环赋值)
//第二种,在定义的同时进行初始化
c := [5] int{1,2,3,4,5}
对于一个数组来说,我们可以很方便的通过索引获取或修改值,但是在真实的用go语言开发时,我们会更多选择使用切片(splice)而不是数组
6.切片(splice)
切片比数组更好的地方在于,切片可以任意更改长度,比如我们可以通过make来创建一个切片,通过索引访问值,还可以通过append方法进行添加元素
s := make([]string,3) //s是一个长度为3的字符串切片
s[0] = "a"
s = s.append("e") //这里注意如果用append方法的话,需要把值重新赋给原字符串
c := make([]string,len(s))
copy(c,s) //把s的内容拷贝到c中
之所以append方法的结果还需要赋值给原数组,是因为slice本质上它储存了一个长度,一个容量,和一个指向数组的指针,如果长度超过容量,就会扩容,并返回新的slice
有趣的是,go语言也支持像Python一样,支持切片操作,例如,我们可以通过s[2:5] 的方式,取出第二个位置到第五个位置上的元素,但是并不包括第五个元素。与Python不一样的是,go语言不支持负数索引
7.map
在Python中map也叫字典,由键值对的集合组成,而在go语言中,它的使用是基本一致的
首先我们需要用make来制造一个空map并定义键值对(k-v对)的类型,然后进行添加,具体定义可以看如下代码
m := make(map[string]int) //意思是m是一个map,key是字符串,value是整数
m["one"] = 1
m["two"] = 2
var n = map[string]int{"one":1,"two":2} //不用make的定义方式
fmt.println(m["unknow"]) //0,也就是所有没有在map中没有存储的key值都为0
所有没有在map中没有存储的key值都为0,由此又可以衍生出新的用法,我们可以定义一个变量,用来存储map中对应键的值,并且用ok来存储这个键是否存在
r,ok := m["three"] //0 false
delete(m,"one") //我们可以用delete方法来删除map中的键值对
go语言中的map是完全无序的,遍历时根据的是随机顺序
8.range
准确的来说,这个是range函数,而且是for循环的一部分,是for循环的range格式
在go语言中,我们可以通过range来迅速遍历切片或map,这样可以使代码看起来更简洁,在range遍历时,会返回两个值,第一个值是遍历的对应索引,第二个是对应索引的值,如果我们不需要索引的话,还可以通过下划线来忽略。
nums := [5]int{1,2,3,4,5}
for key, value :=range nums{
fmt.println(key,value)
}
还可以省略key和value中的任何一个
//省略value
for key :=range nums{
fmt.println(key)
}
for key , _ := range nums{
fmt.println(key)
}
//省略key
for _ , value := nums {
fmt.println(value)
}
9.函数
go语言和其他语言最大不同的地方在于它的变量类型是后置的,而且go语言支持返回多个值,并且在实际开发的过程中,一般都是返回两个值,第一个值是真正要返回的值,第二个返回值是一个错误信息,参数列表后面直接就是大括号意味着没有返回值。
示例:
//最简单的相加函数
func add(a int , b int) int{
return a+b
}
func add(a,b int) int{
return a+b
}
//检验map中是否有存在对应键
func exists(m map[string]string , s string) (v string, ok bool){
v,ok = m[s]
return v,ok
}
10.指针
go语言同样支持指针,但是对指针的支持程度有限,最大的作用就是在函数中对传入的参数进行修改,用法基本和c中的用法一致
示例:
func add(a *int ){
*a++
}
func main(){
a:= 2
add(&a)
fmt.println(a) //3
}
四、结语:
今天的学习到此为止,现在我们基本学习了go语言的环境配置和一点语法,之后可以去尝试一下(尤其是在AI练中学)。
接下来的博客我会更新Go语言学习--Go的基础语法 Part 2