GO语言基础笔记一 | 青训营笔记

59 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

一、初入GO语言

我们先还是看看GO语言的hello world是怎么写的吧

package main 
import "fmt" 
func main() {
    fmt.Println("Hello world!") 
}

第一行 :包声明,编写源文件时,必须在非注释的第一行指明这个文件属于哪个包,如package main

第二行:引入包,其实就是告诉Go 编译器这个程序需要使用的包,如import "fmt"其实就是引入了fmt包

第三行 :主函数 整个程序的入口 整个项目有且只有一个main函数

  • 在 Go 语言里,命名为 main 的包具有特殊的含义。 Go 语言的编译程序会试图把这种名字的包编译为二进制可执行文件。所有用 Go 语言编译的可执行程序都必须有一个名叫 main 的包。一个可执行程序有且仅有一个 main 包。当编译器发现某个包的名字为 main 时,它一定也会发现名为 main()的函数,否则不会创建可执行文件。 main()函数是程序的入口,所以,如果没有这个函数,程序就没有办法开始执行。程序编译时,会使用声明 main 包的代码所在的目录的目录名作为二进制可执行文件的文件名
  • 我们话可以看到每行最后没有 号 这也是和java不同的地方我们要注意

二、变量

首先我们看看go的数据类型有哪些

Go语言将数据类型分为四类:基础类型、复合类型、引用类型和接口类型。

  • 基础类型,包括:数字、字符串和布尔型。
  • 复合数据类型——数组 和 结构体——是通过组合简单类型,来表达更加复杂的数据结构。
  • 引用类型包括指针、切片、字典、函数、通道

变量的申请

  • 方式一 var 变量名 数据类型
    var a int
    a = 1
    var a1, a2, a3 int = 1, 2, 3
    fmt.Println(a, a1, a2, a3)
​

可以看到var a int 使用 var 关键字来申请变量 a是变量名 int是数据类型

  • 方式二 var 申请变量时 赋值
    var b, b2 = 2, 2
    fmt.Println(b, b2)

我们可以看到这样 省略了 数据类型 b b2可以根据后面的值来自动推断数据类型

image-20230115120652636

  • 方式三 var省略
    c := 3
    c1, c2, c3 := 3, 3, 3
    fmt.Println(c, c1, c2, c3)

这样的写法最简单 但是只能 申请局部变量

  • 其他方式
var (
        d int
        e string
        f bool
    )
​
    fmt.Println("d=", d, "e=", e, "f=", f)

三、for循环

在go中只有for循环 没得java中其他的while do-while

for j := 1; j < 11; j++ {
        fmt.Println(j)
    }

可以看到和java相比 for后面没有() 其他差不多j := 7; j < 9; j++中 也可以省略也就是可以有以下的几种写法

for{
        fmt.Println("死循环")
    }
​
    k := 1
    for ; k < 10; k++ {
        fmt.Println(k)
    }
    for i := 1; ; i++ {
        fmt.Println("死循环")
    }
    for i := 1; i < 10; {
        fmt.Println(i)
        i++
    }
​

总之和java差别不是很大

四、条件语句

go语言条件语句有如下几种

image-20230115131637748

4.1 、if语句

Go 没有三目运算符,所以不支持 ?: 形式的条件判断。

if 7%2 == 0 {
        fmt.Println("7 is even")
    } else {
        fmt.Println("7 is odd")
    }
​
    if 8%4 == 0 {
        fmt.Println("8 is divisible by 4")
    }

当然和for循环一样与java相比也没有(),上面的代码只要有点其他语言的基础也能读懂

注意 else后面的 { 不能换行

if num := 9; num < 0 {
        fmt.Println(num, "is negative")
    } else if num < 10 {
        fmt.Println(num, "has 1 digit")
    } else {
        fmt.Println(num, "has multiple digits")
    }

if num := 9; num < 0 我们还能在if里面 申请变量 ;后面 num < 0 才是真正的判断语句

当然if 也能嵌套如下代码

if num := 9; num < 0 {
        if num > -2 {
            fmt.Println("11111111111111")
        }
    } else if num < 10 {
        if num > 0 {
            fmt.Println("22222222222222")
        } else {
            fmt.Println("33333333333333")
        }
    } else {
        fmt.Println("44444444444444")
    }
​

4.2、switch 语句

语法如下

switch var1 {
    case val1:
       // 执行的代码
    case val2:
       // 执行的代码
    case val3:
        // 执行的代码
    default:
        // 执行的代码
}

注意和Java相比 case后面不用加break 当满足case val2的时候并不会在执行下面的 case val3。不同的 case 之间不使用 break 分隔,默认只会执行一个 case

switch 的 default 不论放在哪都是最后执行

值得注意的事 val可以是表达式 也就是说可以替代if语句

a := 1
    switch {
    case a%2 == 0:
        fmt.Println(a % 2)
    case a%2 != 0:
        fmt.Println(a % 2)
    }

运行结果是 1

4.3 、select 语句

select 是 Go 中的一个控制结构,类似于 switch 语句。select 语句只能用于通道操作,每个 case 必须是一个通道操作,要么是发送要么是接收。

如果多个通道都准备好,那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好,那么执行 default 块中的代码。

语法

select {
    case 通道操作1:
        // 执行的代码
    case 通道操作2:
        // 执行的代码
    case 通道操作3:
        // 执行的代码
    default:
         // 所有通道都没有准备好,执行的代码
        
    }