go语言基础语法 | 青训营笔记

79 阅读4分钟

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


Go 语言的基础组成有以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释

一、hello world

学习一门语言时,大家最熟悉的当然是输出hello world了,学习go语言时,也不例外。下面给出一段go语言的hello world代码。

package main

import (
    "fmt"
)

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

这段代码的核心就是调用fmt里的Println函数输出hello world!,类比JavaPrintln我们可以猜出该函数的效果:打印并换行,把 ln 去掉就是不换行.


具体解析:

  1. 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package mainpackage main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  2. 下一行 import "fmt"  告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数。
  3. 下一行 func main()  是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。
  4. 下一行 fmt.Println(...)  可以将字符串输出到控制台,并在最后自动增加换行字符 \n

如果你已经配置了go的环境变量,可以使用go run命令。 执行以上代码输出: image.png


注意

需要注意的是 不能单独放在一行,所以以下代码在运行时会产生错误:

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

二、变量和常量

package main

import (
    "fmt"
    "math"
)

func main() {
    var a = "initial"
    var b, c int = 1, 2
    var d = true
    
    var e float64
    f := float32(e)
    
    g := a + "foo"
    fmt.Println(a, b, c, d, e, f)
    fmt.Println(g)
    
    const s string = "constant"
    const h = 500000000
    const i = 3e20 / h
    fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}

第一种声明变量的方式:使用 var关键字:

var identifier type

可以一次声明多个变量:

var identifier1, identifier2 type

如果变量没有初始化,则默认为零值,类比C语言的全局变量

  • 数字类型为 0
  • 布尔类型为 false
  • 字符串为 ""(空字符串)

第二种声明变量的方式:根据值自行判定变量类型,类似于C++auto

var v_name = value

第三种声明变量的方式:直接使用下面的形式,这种方式最常用。(这种方式只能在函数体中出现,不适用于全局变量)

intVal := 1 

intVal := 1 等同于

var intVal int 
intVal = 1 

常量的定义格式:

const identifier [type] = value

其中说明符[type]可以省略

  • const a string = "abc“
  • const a = "abc"

注意

常量是一个简单值的标识符,在程序运行时,不会被修改的量。

常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。


上面代码运行结果:

initial 1 2 true 0 0
initialfoo
constant 500000000 6e+11 -0.28470407323754404 0.7591753930288755

三、if else

package main

import "fmt"

func main() {
    
    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")
    }
    
    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")
    }
}

跟其他编程语言是一样的,不做详细分析。

注意

  • 条件判断语句不需要加(),并且当只有一行内容时,也不能省略{},这是和大多数编程语言不同的一个地方。

四、switch语句

package main

import (
    "fmt"
    "time"
)

func main() {
    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")
    }
    
    t := time.Now()
    switch {
        case t.Hour() < 12:
            fmt.Println("It's before noon")
        default:
            fmt.Println("It's after noon")
    }
}

注意

  • go语言的 switch 后面跟的变量也是不加括号的,而且也可以省略,并且可以是任意类型。并且每个case 后面都自带 break ,无需自己输入 break ,每个 case 后面的变量类型也可以是任意类型,只要 casecase 之间的类型相同即可。 这点和 JavaC语言 是不一样的。如果我们需要执行后面的 case,可以使用 fallthrough

五、循环语句

go语言只有一种循环,即 for 循环。

go语言的for循环有三种形式:

  • C语言for一样,不同在于括号省略。
for init; condition; post { }
  • Cwhile一样
for condition { }
  • Cfor(;;)一样:
for { }
package main

import "fmt"

func main() {
    i := 1
    for {
        fmt.Println("loop")
        break
    }
    for j := 7; j < 9; j++ {
        fmt.Println(j)
    }
    for n := 0; n < 5; n++ {
        if n % 2 == 0 {
            continue
        }
        fmt.Println(n)
    }
    for i <= 3 {
        fmt.Println(i)
        i = i + 1
    }
}