• Go语言基础语法笔记


    Go语言基础语法笔记

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

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

    package main
    
    import (
    	"fmt"
    )
    
    func sayhellowtoOne(name string) bool {
    	fmt.Printf("Hellow %v
    ", 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
    ", 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部分。

  • 相关阅读:
    linux常用的基础知识
    【AW346】走廊泼水节
    【AW355】异象石
    【POJ3417】闇の連鎖
    【APIO2010】巡逻
    【SDOI2011】消防
    【BJWC2010】次小生成树
    【POJ3613】Cow Relays
    【POJ1734】Sightseeing trip
    【POJ1094】Sorting it all out
  • 原文地址:https://www.cnblogs.com/DLKKILL/p/13462302.html
Copyright © 2020-2023  润新知