这是我参与「第五届青训营 」笔记创作活动的第1天
前言
本系列文章主要从go初学者的角度对go语言进行学习和讨论,本篇文章重点围绕为什么要学习go、go的常见基础语法这两个方面,go语言的环境安装及配置可参考Go语言环境安装及配置_go语言安装_ThrAvicii的博客-CSDN博客)
一、为什么要学习go
在学习基础语法之前,我们先来简单谈谈为什么要学go(go有哪些地方值得我们去学习)。
简单聊聊go出现的背景
在最近十年来,c/c++等编程语言在计算领域没有得到很好的发展,没有新的系统语言出现,很多情况下开发程度和系统效率不能兼得。如c++执行效率高开发效率低;又如java执行效率低但又有有效的编译;这时候就需要一种高效的编程语言,集成了高效的执行速度、编译速度和开发速度的go语言就横空出世了。
go的特点及优势
- 高性能、高并发:拥有能和c++媲美的性能,使用标准库或者基于标准库的第三方库即可开发一个支持高并发的应用程序。
- 语法简单、学习曲线平缓:语法风格类似c语言且进行了简化,初学者易懂,学习成本相对较低。
- 丰富的标准库:有着和java、python一样丰富的标准库,且标准准库具备第三方库所不具备的稳定性。
- 完善的工具链:从开发环境、代码补充提示、包管理、框架都有一系列工具。
- 静态链接:所有编译结构默认静态链接,拷贝编译之后的可执行文件即可运行。
- 快速编译:拥有静态语言里面几乎最快的编译速度。
- 跨平台:go本身能够在常见的操作系统上运行,也能开发Android和IOS软件,有很方便的交叉编译特性。
- 垃圾回收:和java类似,无需考虑内存分配可以专注于业务逻辑。
使用go语言的公司
| 国内/外 | 公司名 |
| 国内 | 字节跳动、腾讯、百度、美团、滴滴等 |
| 国外 | Google、facebook等 |
二、go的常见基础语法
1.Hello World
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
以上是一个非常简单的hello world例子,几乎我们一开始学习任何一门后端的编程语言如c、c++、java都会有这样一个例子来帮助我们快速了解该语言的基本结构。go的程序入口和c一样也是一个main函数;而improt和java的导包、c的引入头文件作用类似,引入所需要的库函数;fmt.Println("hello world")和java里面System.out.println("hello world")的作用一样,打印出hello world的字符串,不过在go里面单条语句不需要以‘;’符号结尾。
2.变量
go里面的变量申明非常的简单,var 变量名即可申明一个变量。
申明一个整数变量a初值为52:
var a = 52
申明一个初值为"萧"的字符串变量b:
var b = "萧"
注意:var申明的变量为动态变量,在给变量初值的情况下无需指定具体的数据类型,go会自定对初值的类型进行判断,例如上面给a的初值为52是一个整数,所以a的数据类型为int;相反的如果未给变量初值,则要指定变量数据类型,变量会以该类型的默认初始值初始化,如下:
var c float64 //默认初值为0
上面的变量声明可简写为另一种形式如下,a :=52的效果等同于var a =52:
a :=52
go里面申明一个常量用const关键字表示:
const d string = "萧"
const e = 500000000
3.if、for、switch
if
示例:
a: =15
if a%2==0 {
fmt.Println("这是偶数")
}else {
fmt.Println("这是奇数")
}
需要注意的是,go里面的流程控制语句如if和其他语言差不多,但是有些细节有改变。在其他语言里面,if的判断表达式会放在一个()里面,go可以省掉这个括号也可以选择加上,一般建议不使用;其他语言的if语句,如果是单句一行可以省略掉后面的{},而go无论是否是单句都要在后面加上{}。
for
示例1:
for {
fmt.Println("loop")
break
}
和if语句一样,go的for语句省略(),如果for后面什么条件都不跟则为死循环,可用break终止循环。
示例2:
for j := 7; j < 9; j++ {
fmt.Println(j)
}
这是加了完整循环条件的,输出结果一定是7和8。
示例3:
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
可以在for里面嵌套if并且使用break和contiue两个关键字
switch
示例:
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
以上是switch常见操作把一个变量作为比较对象然后分支执行,go里面switch每条case后面无需braek来结束,go已经自动实现了;值得一提的是,default一定要放在switch代码块的里case之后,否则当程序执行到default时就会结束当前switch,另外case后面是可以跟代码块的用法和其他语言一样。
4.array、slice、map
array
顾名思义,array也就是指数组,简单的数组定义如下:
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))//此处为打印数组长度,len(array)即可获取该array的长度
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
除了可以定义一维数组也可以定义二维数组:
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
slice
slice指切片的意思,也就是可变数组,类似java里面的List,切片的简单定义如下:
s := make([]string, 3)
切片的定义使用make关键字,必须要指定数组的类型和初始长度,切片的使用如下:
s = append(s, "d")
s = append(s, "e", "f")
c := make([]string, len(s))
copy(c, s)
append函数向某个切片添加一个或多个元素并返回该切片,所有用使用对应切片来接收结果;copy函数把一个切片的元素复制给另一个切片,上面的即把s里的元素复制给c。
map
map映射,在java里更喜欢叫hashmap或者map集合,定义一个map如下:
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
删除map里面的一个元素如下:
delete(m, "one")//m:要操作的map,"one":要删除的元素的键
map的定义也可以写成以下方式:
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
map里面的元素是以键值对存在的,相较于java的map会将里面的元素默认排序,go的map里面的元素是随机无序的。
小结
编程语言千千万,它们都大同小异的,有着共性与自己的特性和优缺点。go语法就结合了java、c++的语法并有其自己的特性,go还有着高性能高并发的特点。学习一门语言首先就是从基础开始,有一个好的基础才能走得更久更远,打好基础努力是必不可少的,希望我们在不断的努力中茁壮成长。
参考
本文章部分内容学习或参考自以下课程或网页
- 字节跳动青训营GO原理基础课程
- 【狂神说】Go语言零基础学习视频通俗易懂-哔哩哔哩