美文网首页Go语言常知常会
Go语言常知常会-基础篇

Go语言常知常会-基础篇

作者: 要厉害的 | 来源:发表于2020-07-26 15:07 被阅读0次

    知识点var,for循环、while循环、死循环、空标示符、if语句、多行注释、包管理等

    1、var变量声明

    var是用来声明变量的关键字,一般格式是

    var  关键字  变量类型

    比如

    // 声明一个string类型的变量,名称为name。常用的变量声明方式之一

    var  name string 

    完整格式

    var  关键字  变量类型 = 赋值表达式

    比如

    var name string = "Jack"

    变量在声明的时候可以初始化,如果没有显式的初始化,则会根据变量类型隐式地初始化为0或空字符等等。这是Go语言中的zero-value 机制,保证每个变量都有一个合适的类型。

    其它的声明和初始化的方式有

    //使用:=,也叫短变量声明,常用的变量声明方式之一。

    name := ""

    //显式初始化,隐式的类型

    var name = ""

    //显式初始化,显式的类型

    var s string = ""

    2、支持循环的语句for

    结构如下

    for 初始化语句; 条件语句;执行后的语句{

           //一些操作语句

    初始化语句在for循环开始之前执行。

    Go里面的while循环通过将for循环中的初始化语句和执行后的语句删除来表达,结构如下

    for  条件语句 {

    Go里面的死循环直接将for循环的初始化语句、条件语句、执行后语句删除表达,结构如下

    for {

    Go里面也使用continue的关键字允许跳过一些执行语句,直接进入下一次循环。

    3、空标示符

    也就是下划线标示"_"。它的出现是由于Go语言不允许出现未使用的局部变量。它在语法上需要一个临时变量,但是代码逻辑不需要的时候使用。比如,和range配合起来,range返回的是键值对。空标示符可以作为索引值(key)使用,也可以代替值使用。如果真的需要使用这个变量,还是最好起个名字:)

    //代替键使用

    for  _, name := range os.Args[1:] {

    }

    空标示符是没有办法使用的。

    4、 条件语句if

    跟其它语言语法无区别,格式如下

    if 条件语句 {

    }else {

    5、多行注释

    跟C和C++一样,GO使用/* ... */作为多行注释。

    6、格式化输出

    使用fmt里的Printf函数,可以达到和C语言中printf同样的效果

    fmt.Printf("%d, %s\n", id,  name)

    7、指针

    Go语言也提供指针,通过&来获取指针地址,*来获得指针所指向地址的值。空的指针是nil。

    8、常用包

    Go语言有着100余个标准包,提供大量的基础函数。提供包管理工具是基于模块化管理的思想,让相似的功能聚合到一起,达到高类聚的设计理念,这为大型工程的设计和维护提供了基础。包只需要对外暴露接口和帮助文档,而实现的细节则封装到每个包的具体实现内。通过包的封装,程序的变动将只会影响局部,而不是全局。

    试了一下大概有143个包。

    Go 语言的导入使用import。如果打算对外提供包,则最好在包前加上域名。

    import path

    在每个文件的开通使用package来声明该包的名称。只有路径+包才能定义具体使用的包,即Apath/ApackageBpath/Apackage虽然名称相同,但是不同的包。面对这样的情况引入包的程序,可以选择使用一个别名来替代其中一个重名的包(别名只在导入的文件中有作用),如下:

    import (

           "Apath/Apackage"

           xpackage "Bpath/Apackage"    //使用别名,避免冲突

    )

    例举一些常用的包和其中的函数功能。

    net 和网络相关http.Get, http.HandleFunc,http.ListenAndServe

    io 和输入输出相关 ioutil.ReadAll,io.Copy, ioutil.Discard

    math 提供数学计算

    image 和图像处理相关

    os 和系统相关Stdout Stderr等

    fmt 和格式化输出相关Printf,Println等fmt.Sprintf

    time 和时间相关time.Now

    log 和日志相关,log.Fatal

    syn 和同步相关sync.Mutex(互斥锁)

    flag 提供命令行传递参数的功能,如flag.Parse(),flag.Args()

    使用go doc工具提供查看每个包或者函数的支持文档,也可以通过https://golong.org/pkg获取相关信息。

    9、管道

    Go语言中Gorutine之间通信的方式为Channel。

    //管道的创建

    ch := make(chan 类型)

    //从管道中获取

    fmt.Println(<-ch)

    //输出到管道

    ch <- fmt.Sprintf("")

    10、变量名称

    Go语言中包名一般为小写,外部可见的函数、变量一般大写。使用驼峰命名法。

    11、文件结构

    每个文件需要写上属于哪个package,文件属于哪个package。文件结构如下组织

    package XXXX

    import XXXX

    包级别的类型、变量、常量、函数声明

    函数定义

    12、函数结构

    Go当中的函数结构如下定义

    func 函数名称 (参数名称 参数类型)返回值类型 {

    13、作用域

    Go语言的变量是有作用域的,分为4种:

    universal 全局的比如内置函数、类型等,float64、new

    package level 任何函数外的变量

    file level 导入的变量、函数等

    local 本地变量

    可以在不同的范围内声明相同名称的变量,但是存在一种shadow的机制,shadow是指声明的变量有着相同的名字,但是作用域不同,则更靠近执行语句内部的声明会让更外部的失去效果(inaccessible)。比如new在Go中用来创建一个变量。但是,一不小心重定义该名称,则new就失去了本来的作用,变成一个普通的变量。如下代码段所示

    func delta(old, new int) int { return new - old}

    14、垃圾回收机制

    Go语言提供垃圾回收机制,使用者不需要显式地分配和释放内存,但使用者仍然需要考虑如何利用好内存。比如,避免长生命周期的对象中出现指针指向一个短生命周期的对象,长生命周期对象不回收的情况,会让垃圾回收机制也无法回收分配的短生命周期的对象,造成内存浪费。

    15、声明新的类型

    使用基本的类型来声明新的类型

    type 新的类型名称 低层类型

    比如,Age类型都是int型的

    type  Age int

    不同的类型都有转换操作T(x),即将x转换成T类型。低层类型相同的两个新类型不能直接比较。

    16、元组赋值

    Go语言中赋值的一种方式,让赋值“=”的右边和左边一一对应。在等式两边同时需要出现相同变量的场景(比如交换值),该机制非常非常好用。该机制基于更新左边变量前,右边的值都已经确定下来(evaluted),因此,不用担心在赋值的时候有负面效果。

    x, y = y, x

    相关文章

      网友评论

        本文标题:Go语言常知常会-基础篇

        本文链接:https://www.haomeiwen.com/subject/vjpsfktx.html