Go 语言入门--Go语言基础语法 Part 1

146 阅读7分钟

Go 语言入门--Go语言基础语法 Part 1

一、前言

这是我写的第一个博客,用来记录我的学习历程,不知道是否可以帮助到学习go语言的人,写的不好轻喷

二、环境的搭建

1.Go语言的下载

在学习Go语言之前,我们首先要先下载go语言,在下面的的网站可以进行对应的下载

go.dev/

2.Go语言的环境配置

为了方便大家进行对应的配置,我直接把对应的视频链接放在下面

www.bilibili.com/video/BV17G…

配置 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