Go 语言入门指南:基础语法和常用特性解析| 青训营

89 阅读4分钟

0.引子

这个系列主要用来记录在字节青训营的GO学习所得

1.你好,世界:

来一个经典起手式,hello world,同时借这个程序简单分析一下go语言中一个基本程序的构成

package main

import "fmt"

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

Go语言的整体风格趋近于c/c++,同时兼具python的简洁,在这个代码中,我们首先在行1见到了package的概念, 在Go中,任何一个程序都需要属于某一个包,这种设计的源头来自于Go使用包来组织源代码的,并实现命名空间的管理。

第二行的import "fmt"则代表引fmt包,与其他语言类似,go语言内置了标准库,用于方便开发者控制输入输出,其中fmt库主要用于精细化控制代码的输出格式。

第三行来到了我们的主函数,与c语言相同,go语言大部分程序的执行都是从main函数开始的,有关函数的概念会在后面的章节进行进一步的介绍,此处main函数中只有一条语句,用于调用fmt包中的Println这个方法打印Hello World!这串字符

2.变量与常量的定义:

Go语言定义变量和常量的方式有很多,本文中主要介绍以下3类

2.1全局变量声明与赋值:

在go中,可以通过var关键字对全局变量进行声明,同时也可以在声明的同时对其进行赋值,具体的方式如下所示:

var a int
var b float
var a int = 1
var b, c int = 12

2.2局部变量声明与赋值:

在go中,也可以通过:=来对局部变量进行声明和赋值。

a := 1
b := "hello"

2.3通过类型推导对变量进行声明和赋值:

这种可以被视为全局变量声明与赋值的一种变体,此时我们不需要给出具体的变量的数据类型,其主要形式如下所示:

var user = "Hank"
var num = 1

2.4 常量的定义:

//单个常量定义
const a int = 1
//一次定义多个
const (
    Unknown = 0
    Female = 1
    Male = 2
)

2.5 几个小坑:

  1. Go中的变量在声明后必须被使用(这一点编译器回帮助检查)
  2. Go中根据首字母的大小常常被用来确定访问权限。无论是方法名、常量、变量名还是结构体的名称 如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中(即本程序中)使用

3 函数

在上个章节中提到了main函数,Go中的函数的定义与大部分程序语言相同,在这里我们先对Go语言中函数的一些特性基本性质做一个简单的介绍:

  1. 函数可以作为值进行传递:在Go语言中,函数可以像其他类型的值一样被传递给其他函数或赋值给变量。这意味着可以将函数作为参数传递给其他函数,也可以将函数作为返回值返回。
  2. 函数可以赋值给变量:在Go语言中,可以将函数赋值给变量,然后通过变量来调用函数。这种能力使得函数可以像其他数据类型一样被操作和处理。
  3. 函数可以匿名定义:Go语言支持匿名函数的定义,也称为闭包。这意味着可以在不给函数命名的情况下直接定义和使用函数,更加灵活和便捷。
  4. 函数可以作为数据结构的成员:在Go语言中,函数可以作为结构体的成员,从而使得函数与其他数据一起存储在结构体中。这种特性使得函数能够更好地与数据相关联,实现更复杂的功能。

一个经典的Go函数的定义如下:

func add(a, b int) int {
    return a + b
}

值得留意的是go语言中的函数同时支持返回多个返回值,具体的形式如下所示:

func add(a, b int) int {
    return a + b,a,b
}

4 流程控制

4.1 if-else

这个其实相对没有太多难点,简单用一个判断奇数偶数的程序来做一个示例

package main

import (  
    "fmt"
)

func main() {  
    num := 27
    if num % 2 == 0 { //判断条件:是否可以被2整除
        fmt.Println("这是个偶数") 
    }  else {
        fmt.Println("这是个奇数")
    }
}

Go同时也支持else-if结构,具体实现是这样 import (
"fmt" )

package main

import (  
    "fmt"
)

func main() {  
    num := 100
    if num <= 20 {
        fmt.Println("数字小于20捏")
    } else if num >= 21 && num <= 30 {
        fmt.Println("数字在21和30之间捏")
    } else {
        fmt.Println("数字大于30捏")
    }

}

4.2 循环

go中没有while循环,循环主要通过for循环来执行,以下通过一个简单的例子来说明基本循环结构,下面是一简单的求累加和的程序,整体风格和c/c++的一致

package main

import "fmt"

func main() {
   sum := 1
   for ; sum <= 10; {
      sum += sum
   }
   fmt.Println(sum)

}

这段代码可以将循环部分更改为更加接近于while循环的风格

   for sum <= 10{ //类似于while(condition)
      sum += sum
   }

break和continue的用法和其他程序语言中类似,break用来跳出这个循环,continue则用于跳过当前循环的剩余循环,以下是一个break的例子

package main  
  
import (  
    "fmt"  
)  
  
func main() {  
    i := 0  
    for {  
            i++  
            if i > 5 {  
            break //只打印0到5,到5的时候直接跳出这个循环  
        }  
    fmt.Println(i)  
    }  
}

而以下是一个continue的例子,跳过打印数字6

package main  
  
import (  
    "fmt"  
)  
  
func main() {  
    i := 0  
        for i <= 10 {  
            i++  
            if i == 6 {  
            continue //跳过打印6
        }  
        fmt.Println(i)  
    }  
}