Golang语法基础1 | 青训营笔记

95 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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中的ifelse if后面没有括号,如果你写了括号的话,保存代码时编译器也会自动将括号去除

第二个不同点是go中的ifelse ifelse后的代码段必须加大括号,且代码段和ifelse ifelse语句不能放在同一行

例如:

if 6%2 == 0 {
   fmt.Println("6 is even")
} else{
   fmt.Println("6 is odd")
}

4.循环

Go语言中只有for循环,其语法和C++类似,但是可以省去3段表达式中的任意一段,亦或是什么都不加,也就是形成一个死循环

在循环语句内也可以使用breakcontinue语句来跳出或继续循环 例如:

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,这里不支持负数索引