这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
1.经典Hello World!
package main
package main代表代表这个文件是main包的一部分,也就是程序的入口包
import (
"fmt"
)
import导入了标准库中的fmt包,FMT包主要用于往屏幕输入输出字符串、格式化字符串
func main(){
fmt.println("hello world!")
}
这是main函数,调用fmt并代言输出hello world!
2.Go中的变量
Go语法中声明变量主要有2种方式.
一是通过var语句来实现:
var 变量名 变量类型(非必要可省略)= 值
例如:
var a = "initial"//go中字符串是内置类型 可以直接用+连接 或者用=进行比较
var b, c = 1, 2
var d = true
var e float64
fmt.Println(("hello world"))
fmt.Println(a)
fmt.Println(b, c)
fmt.Println(d)
fmt.Println(f)
var语句一般会进行自动类型推导。当然如果有需要的话,你也可以指定变量类型
二是通过:=符号来实现:
变量名 := 变量类型(值)//变量类型(非必要可省略)
例如:
f := float32(e)
g := a + " bytedance"
fmt.Println(g)
PS: 如果我们需要声明常量的话,语法和第一种类似,只需把var改成const即可
值得注意的是,go语言中的常量是没有确定的类型的,会根据上下文进行推导
3.if-else语句
Go语言中if-else语法和C++中类似,但是有2个不同点
第一个不同点是go中的if和else if后面没有括号,如果你写了括号的话,保存代码时编译器也会自动将括号去除
第二个不同点是go中的if和else if和else后的代码段必须加大括号,且代码段和if、else if、else语句不能放在同一行
例如:
if 6%2 == 0 {
fmt.Println("6 is even")
} else{
fmt.Println("6 is odd")
}
4.循环
Go语言中只有for循环,其语法和C++类似,但是可以省去3段表达式中的任意一段,亦或是什么都不加,也就是形成一个死循环
在循环语句内也可以使用break、continue语句来跳出或继续循环
例如:
for i:=7;--i{
fmt.Println(i);
if i==3{
break;
}
}
5.switch
Go语言中的switch结构也和c++中的语法比较类似,同样的switch后紧跟的变量名不需要加括号
这里有一个最大的不同是,
在c++中switch case语句中如果不加break会继续往下跑完所有的case
而Go中是不需要添加break的,因此Go中的switch语句更加强大
你可以使用任意变量类型,也可以不在switch后添加任何的变量,然后在case中写条件分支,这样会比多个if-else嵌套语句更加清晰
例如:
package main
import{
"fmt"
"time"
}
func main(){
currentTime=time.Now()
switch{
case currentTime<12:
fmt.Println("Good morning!")
default:
fmt.Println("Good evening!")
}
}
6.数组
不多赘述,有编程基础应该很好理解,需要注意的是语法
由于数组长度是固定的,因此在项目中很少使用
以下列语句为例:
package main
import{
"fmt"
}
func main(){
var a [5]int
a[3]=6
fmt.Println(a[3],len(a))
b:=[5]int{1,2,3,4,5}
fmt.Println(b)
var twoSum [3][4] int
for i:=0;i<3;i++{
for j:0;j<4;j++{
c[i][j]=i+j
}
}
7.切片
切片不同于数组,可以任意修改长度,有着比数组更加丰富的操作
Go中的切片许多操作和c++中的vector类似
这里我们可以通过make来创建一个切片,使用append来追加元素
例如:
import "fmt"
func main(){
s:=make([]string,3)
s[0]="T"
s[1]="S"
s[2]="M"
fmt.Println("get s[0]:",s[0])
fmt.Printlb("get length:",len(s))
s.append(s,"N")
s.append(s,"B")
fmt.Println(s)//Print [T S M N B]
c:=make([]string,len(s))
copy(c,s)
fmt.Println(c)//Print [T S M N B]
fmt.Println(s[2:3])//Print [M N]
fmt.Println(s[3:])//Print [N B]
fmt.Println(s[:3])//Print [T S M N]
}
语句s:=make([]string.3)创建了一个长度为3的切片
注意append 的用法的话,你必须把append的结果赋值为原数组。
这是因为slice的原理,slice存储了一个长度和一个容量,加一个指向一个数组的指针,在你执行 append操作的时候,如果容量不够的话,会扩容并且返回新的sice
slice初始化的时候也可以指定长度。 slice拥有像python一样的切片操作,比如这个代表取出第二个到第五个位置的元素,不包括这五个元素。不过不同于python,这里不支持负数索引