【入门系列】Golang入门语法初探 | 青训营笔记

145 阅读3分钟

题图 这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。

曾经有一位知乎网友说过:只要这门编程语言拥有加减乘除和循环判断,那么它就是一门合格的编程语言。

不管是哪一门语言,只要是入门,就一定绕不开声明、判断和循环。这篇文章分享我在编写Golang时用到的一些入门语法。

在开始之前,需要说明一些标记:

...   表示可以出现至少一次,且需要用逗号隔开;
()    表示括号内的内容可以出现至多一次;
...() 表示括号内的内容可以出现至少零次,且需要用逗号隔开。

声明

golang的声明一共有varconsttype和简易声明四种,声明语法(除简易声明)为:

announce ...name type 或 announce ...name type

1. var

最简单的方式是只声明一个变量名称:

var a int

变量声明不仅可以用于简单变量,还可以用于其他复杂的变量,譬如:

var f func(int) bool
var conn struct {
    username string
    password string
}

当然,如果你想声明多个同类型变量,可以这么写:

var b, c int

甚至说如果需要其他不同类型的变量,可以这么写:

var (
    e error
    g *float64
)

在变量定义后,变量将会初始化为空,但如果需要设置初始值,则可以:

var foo int = 1

或者是使用右值类型推断来省略变量类型,譬如:

var bar = "Hello World"

2. const

const声明与var大同小异,但是在某些常量声明(如枚举)中,可与iota配合使用,譬如:

const (
	TypicalNoob           = iota // 0
	TypicalHipster               // 1   TypicalHipster = iota
	TypicalUnixWizard            // 2   TypicalUnixWizard = iota
	TypicalStartupFounder        // 3   TypicalStartupFounder = iota
)

请注意:Golang iota 在括号外无法实现递增。

3. type

type声明与var大同小异,但type声明适用于类型,而var声明适用于变量,譬如:

    type Duration int64
    const NanoSecond Duration = 1

当然也可以定义一个结构体,譬如:

type Foo struct {
    foo string
}
var foo_ Foo
foo_.foo = "Hello World"

type声明也吸收了面向对象设计的长处,只需要在struct变量中添加父类型即可,譬如:

type Foo struct {
    foo string
}
type Bar struct {
    Foo
    bar int
}

4. 简易声明

简易声明的语法为:

...name := expression

譬如:

foo := 1

或者如果右值表达式有多个变量,则可以:

file, err := os.Open("hwk1.md")

判断

Golang的判断语法有两种,分别是if elseswitch case

1. if else

if else的语法如下:

if ...expression; condition {
    // TODO
} ...(else if ...expression; condition {
    // TODO
}) (else {
    // TODO
})

譬如:

if file, err := os.Open("hwk1.md"); err != nil {
	fmt.Println(err.Error())
} else {
	file.Write([]byte("Hello World"))
}

请注意:if语句块内的变量只能用在语句块内,如果需要在语句块外使用,请在外部定义。

2. switch case

switch case的语法如下:

switch {
    ...case expression:
        // TODO
    default:
        // TODO
}
// 或
switch variable {
    ...case constant:
        // TODO
    default:
        // TODO
}

譬如:

func ScoreGrade(score int) {
    switch {
        case score >= 90:
            fmt.Println("优秀")
        case score >= 80:
            fmt.Println("良好")
        case score >= 70:
            fmt.Println("中等")
        case score >= 60:
            fmt.Println("优秀")
        default:
            fmt.Println("不及格")
    }
}

func Operate(a, b int, operate rune) {
    switch operate {
        case '+':
            fmt.Println(a + b)
        case '-':
            fmt.Println(a - b)
        case '*':
            fmt.Println(a * b)
        case '/':
            fmt.Println(a / b)
        default:
            fmt.Println("错误操作")
    }
}

注意:switch在进入判断后会直接跳出判断,需要在判断结束前添加fallthrough关键字。

循环

Golang只有一种循环方式,即for循环,语法如下:

for init; condition; post {
    // TODO
}
// 或
for (condition) {
    // TODO
}
// 或
for key, value := range sequence {
    // TODO
}

其中,init 一般为赋值表达式,给控制变量赋初值;condition 关系表达式或逻辑表达式,循环控制条件;post 一般为赋值表达式,给控制变量增量或减量;sequence 为序列变量,如数组、map。

譬如:

lst := []int{1, 2, 3}
for i := 0; i < len(lst); i++ {
    // TODO
}
for key, value := range lst {
    // TODO
}

结语

Golang的基础语法就到这里,希望能对大家有所帮助!