Go语言基础语法笔记

Go语言基础语法笔记

最近在学习Go语言的基础语法,学习教程为 A tour of go ,本文记录了Go语言的最基础知识,包括基础的程序代码结构,变量以及函数的定义,和基础常量的定义等。

一段最简单的Go语言程序示例如下:

package main

import (
        "fmt"
)

func sayhellowtoOne(name string) bool {
        fmt.Printf("Hellow %v\n", name)
        return true
}

func main() {

        var name string = "dlk"
        ok := sayhellowtoOne(name)
        if ok {
                fmt.Println("OK")
        }
}

观察这段代码我们可以发现,Go语言的代码和从前我所熟悉的C++、Java有许多类似的地方,但也有一些差别,其中最明显的应该就是Go语言的变量定义方式和其他语言有很大的不同。下面以这段代码为引,总结记录一下Golang语言的一些最基础的语法知识。

1.整体框架

Go语言与其他语言类似,也是由包名的定义与引入、函数的定义、变量的定义以及控制语句等部分组成。在本段代码中,引入了fmt包,以main包里面的main函数作为程序的入口函数,同时定义了一个sayhellowtoOne()的函数。本段程序运行的结果就是简单的调用一个打印函数,根据传入函数的变量值的不同,输出不同的内容。

2.包

Go语言与Java等语言类似,利用包结构来管理组织代码文件。

定义当前包

Go语言与其他语言一样,使用package来定义一个包,通常程序由main包作为程序的入口。

示例:

package main

引用其他包

与很多语言类似,Go语言同样是利用import来引入其他包,就比如import "fmt" 这种形势,但是GO语言同时还支持利用一个import关键词同时引入多个包,就像下面这段代码一样。

import (
        "fmt"
        "runtime"
)

如代码所示,一个import关键词后面跟一个圆括号,里面就可以同时引用多个包。

3.如何进行定义

变量的定义

与其他语言不同,Go语言采用了先指出变量名,再指出变量类型的方式来定义变量。例如:var x,y,z int

这样我们就定义了三个整数类型的变量(注意在Go中声明了变量而不使用的话会提示错误)。据官方文档中的解视,这种定义方法比传统方法更可读,可以按自然逻辑从左相右阅读。例子中的代码的意思就是首先声明了要定义变量,然后定义了三个变量,他们的类型为整数类型,据说这样理解比较自然。另外在函数的一些复杂情况的声明中,这样也比较有优势,具体可以看官方文档 declaration-syntax

Notes:

  • 变量的默认值

       如果没有对变量设置初始值的话,数值类变量的默认值将为零,字符串默认为一个空串,指针类型默认为nli

  • 快速定义变量

       在Go语言中可以利用:=运算符快速定义一个变量,且这种变量会自动根据右边的类型推导左边变量的类型,实现快速定义的目的。例如:i:=1,这种方法便快速定义了一个整数变量并赋予了值。

函数的定义

定义函数使用关键词func,例如例子中的代码func sayhellowtoOne(name string) bool 该段代码简单定义了一个sayhellowtoOne函数,并且如Go语言中所规定的那样,名在前类型在后,从左往右读。首先是变量名,然后圆括号里面定义函数参数,函数参数也是使用一般变量的定义方式,然后圆括号后面定义返回值的类型(注意这里可以同时定义多个返回值),最好尖括号里面是函数的主体部分。

4.函数的编写

在上一节的例子中已经知道了如何定义一个函数,但是在函数的具体编写过程中,还有一些特殊的值得注意的地方。

多个返回值

Go语言支持同时返回多个返回值,只需要在返回值定义的地方进行定义,然后利用return关键词进行返回即可。

func swap(a,b string)(string,string){

}

预定义的返回值

Go语言可以不使用return语句显式的进行返回值,而是在定义返回值类型的时候,同时给出返回值的变量名(即定义了用于返回值的变量),这样,在函数结束后,将自动的返回定义的变量的值。但是这样做会牺牲代码的可读性,因此一般用在较为简单的函数中。

func returnAvalue() (a int) {
        var x, y int
        x = 0
        y = 1
        a = x + y
        return
}

5.控制语句的使用

5.1 if...else...语句

if语句是最常见的条件判断语句,在Go中,基本上所有的控制语句的判断部分都不需要加圆括号括上,但是后面的执行部分必须要尖括号括起来。同时,Go语言支持在if后面临时定义变量,但必须用:=符号进行定义,不支持使用var的方式,同时该变量的作用域直到该条件判断语句结束为止。

例如:

if ok := sayhellowtoOne(name); ok {
                fmt.Println("OK")
        } else {
                fmt.Println("error")
        }

5.2 for 控制语句

for循环的书写使用方式与if...else...语句类似。举例如下:

//实现求开根值的算法
func sqrt(x float64) float64 {
        var z float64 = 1
        for i := 0; i < 10; i++ {
                z -= (z*z - x) / (z * 2)
                fmt.Printf("%v\n", z)
        }
        return z
}

同时。利用for循环语句,我们可以实现类似while语句的效果

var i int = 0
for i<20 {
        i++
}

5.3 defer语句

被defer关键词标记的语句会在他所在的函数执行完return语句后开始执行

例如我们在执行文件的读取操作时,利用该语句来保证文件被正确关闭

func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}

以官方提供的这段代码为例,利用defer语句实现了如果文件被正确打开,那么他将在函数整个执行完成之后被正确的关闭,而不用担心因为出现erro导致函数提前返回而有的文件无法关闭的问题。有点类似JAVA里面的try...catch...finally语句里面的finally部分。