• Go 初识


    一、go语言简介

     Go语言的吉祥物-金花鼠

    1-1、Go语言的由来

    Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

    Go语言的主要开发者有:肯.汤姆逊(Ken Thompson)、罗布.派克(Rob Pike)和罗伯特.格里泽默(Robert Griesemer)。

    肯.汤姆逊(Ken Thompson):图灵奖得主,Uinx发明人,B语言作者(C语言前身),还做飞行员,后来被谷歌挖走。
    罗布.派克(Rob Pike):Unix团队和Plan 9操作系统计划的成员,与Ken老爷子共事多年,并共创出广泛使用的UTF-8 字元编码。
    罗伯特.格里泽默(Robert Griesemer):曾协助制作Java的HotSpot编译器,和Chrome浏览器的JavaScript引擎V8。

    1-2、Go语言的开发背景

    • 计算机硬件技术更新频繁,性能好,编程语言不能合理的利用多核多CPU优势
    • 软件复杂程度越来越高,维护成本高,缺少简洁高效的编程语言,例如:风格不统一,计算能力不够,不能处理大并发
    • c系列项目运行速度快,但是开发效率和编译效率慢,存在内存泄露
    • python项目开发效率快,但是运行效率和CPU利用率低

    1-3、Go语言的特点、应用领域

    • 静态编译语言的性能和安全,动态语言的开发维护效率
    • 继承c的理念,表达式语法,控制结构,基础数据类型,调用参数传值,指针等
    • 包的概念,组织程序结构,go文件归属于一个包下,不能单独存在
    • 垃圾回收机制,内存自动回收,不需要开发人员管理
    • 语言层面天然支持并发,关键字go
    • 管道通信机制,goroutine之间通信
    • 函数多返回值
    • 创新:切片slice,延时执行defer
    • 编码风格统一,简单易懂
    • 标准库丰富强大

    应用领域

    • 云计算
    • 区块链
    • 服务器
    • web开发

    主要项目

    • Docker,Docker 是一种操作系统层面的虚拟化技术,可以在操作系统和应用程序之间进行隔离,也可以称之为容器。Docker 可以在一台物理服务器上快速运行一个或多个实例
    • Kubernetes,Google 公司开发的构建于 Docker 之上的容器调度服务,用户可以通过 Kubernetes 集群进行云端容器集群管理。
    • etcd ,一款分布式、可靠的 KV 存储系统,可以快速进行云配置。
    • beego,是一个类似 Python 的 Tornado 框架,采用了 RESTFul 的设计思路,使用 Go 语言编写的一个极轻量级、高可伸缩性和高性能的 Web 应用框架。

    二、Go 语言基础语法

    注释

    //这是单行注释
    /*
    这是多行注释1
    这是多行注释2
    这是多行注释3
    */

    简单的示例

    package main
    import "fmt"
    var a int = 123
    func main() {
        fmt.Println(a)
    }
    /*
    所有功能都是通过导包的形式调用,导入的包必须使用,否则会报错
    package + 包名 表明当前文件属于哪个包
    main包 表示当前文件属于项目根目录
    包内的元素是共享的
    首字母大写的变量可以被外部导入
    一个项目只能有一个可执行文件
    main() 它是一个项目的入口,运行项目其实就是运行main()
    */

    关于go命令的路径

    • go命令 + 文件路径:

        绝对路径:文件绝对路径
        相对路径:相对的是当前路径

    • go命令 + 项目路径:

        绝对路径:项目绝对路径
        相对路径:相对的是src

    常用的4个go命令

    • go run:编译并执行,但不保存编译结果
    • go build:编译,结果放在当前路径

        -o:指定结果存放路径

    • go install:编译

        编译的是可执行项目:结果放在bin下
        编译的是非可执行:结果放在pkg下

    • go fmt:

        代码格式化

     变量

    先强调一点:在函数中的局部变量定义完之后,必须要使用,否则会报错。全局变量不存在该情况。

    Go语言定义变量的5种方式:

    ① var 变量名1,变量名2 类型字面量(int,float64,bool,string)

     

    ② var 变量名1,变量名2 类型字面量 = 变量值1,变量值2 

    ③ var 变量名1,变量名2 = 变量值1,变量值2 不定义字面量,系统会根据数据自动判断数据类型

    ④ a := 100 //短声明 ==>只能用在函数内部,无法用在全局

     

     ⑤ var (

      变量名1 字面量 = 变量值1

      变量名2 字面量 = 变量值2

    )

     变量的赋值

    要求:类型要一致、支持多变量赋值、支持交叉赋值

    一些必要的规范

    命名规则

    • golang的变量函数命名需要使用驼峰命名法,且不能出现下划线, 文件名使用下划线
    • golang中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用可以简单的理解成: 首字母大写是公有的,首字母小写是私有的文件的命名,全小写,测试的文件:xxx_test.go包名和文件夹名字最好一样

    变量命名规则

    • 变量命名命名必须清晰、明了,有明确含义的单词,命名中禁止使用缩写,除非已是业界通用或标准化的缩写;
    • 单字母名称仅适用于短方法中的局部变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称且有意义的名称。
    • 变量名称一般遵循驼峰法,但遇到特有名词时,需要遵循以下规则:如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient,其它情况都应当使用该名词原有的写法,如APIClient、repoID、UserID

    错误示例:UrlArray,应该写成urlArray或者URLArray

    一些常见的特有名词:
    // A GonicMapper that contains a list of common initialisms taken from golang/lint
    var LintGonicMapper = GonicMapper{
        "API":   true,
        "ASCII": true,
        "CPU":   true,
        "CSS":   true,
        "DNS":   true,
        "EOF":   true,
        "GUID":  true,
        "HTML":  true,
        "HTTP":  true,
        "HTTPS": true,
        "ID":    true,
        "IP":    true,
        "JSON":  true,
        "LHS":   true,
        "QPS":   true,
        "RAM":   true,
        "RHS":   true,
        "RPC":   true,
        "SLA":   true,
        "SMTP":  true,
        "SSH":   true,
        "TLS":   true,
        "TTL":   true,
        "UI":    true,
        "UID":   true,
        "UUID":  true,
        "URI":   true,
        "URL":   true,
        "UTF8":  true,
        "VM":    true,
        "XML":   true,
        "XSRF":  true,
        "XSS":   true,
    }
    一些常见的特有名词

    函数命名规则
      驼峰式命名,名字可以长但是得把功能,必要的参数描述清楚,函数名名应当是动词或动词短语,如postPayment、deletePage、save。并依Javabean标准加上get、set、is前缀。例如:xxx + With + 需要的参数名 + And + 需要的参数名 + …..

    结构体命名规则
      结构体名应该是名词或名词短语,如Custome、WikiPage、Account、AddressParser,WriteDbMgr,ConfMgr,避免使用Manager、Processor、Data、Info等类名,而且类名不应当是动词。
      结构体中属性名大写,如果属性名小写则在数据解析(如json解析,或将结构体作为请求或访问参数)时无法解析
    包名命名规则
      包名应该为小写单词,不要使用下划线或者混合大小写。

    接口命名规则

    单个函数的接口名以”er”作为后缀,如Reader,Writer。接口的实现则去掉“er”。
    type Reader interface {
        Read(p []byte) (n int, err error)
    }
    
    //两个函数的接口名综合两个函数名
    type WriteFlusher interface {
        Write([]byte) (int, error)
        Flush() error
    }
    
    //三个以上函数的接口名,抽象这个接口的功能,类似于结构体名
    type Car interface {
        Start([]byte) 
        Stop() error
        Recover()
    }

    注释
    在编码阶段应该同步写好变量、函数、包的注释,最后可以利用godoc导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。
    每个包都应该有一个包注释,一个位于package子句之前的块注释或行注释。包如果有多个go文件,只需要出现在一个go文件中即可。

    // log包实现了常用的log相关的函数
    package log 
    
    导出函数注释,第一条语句应该为一条概括语句,并且使用被声明的名字作为开头。
    // 求a和b的和,返回sum.
    func Myfunction(a, b int) (sum int){
    
    }

    常量

    常量均需使用全部大写字母组成,并使用下划线分词:const APP_VER = “1.0”

    如果是枚举类型的常量,需要先创建相应类型

    Go语言中的常量

     首先:常量的内存读写权限位只读权限,也就是说常量定义了就无法更改

    定义方式:

    1.const 常量名 类型字面量 = 常量值

    2.const 常量名 = 常量值

    3.const (

      常量名1 = 值1

      常量名2 = 值2

    常量组

      1 空常量的值和类型,与上方最近的变量值与类型一致

      2 空常量的个数要与上方最近的非空常量一致

    自增常量组:iota

      从0开始计数

      默认类型int

    占位符 _ = iota

    iota参与运算

      const (
    
        _ = iota*3
        a
        b
        c
        )

    中断与恢复

      const(
    
        _ = iota*3
        a
        b
        c = iota
        d
    )

    多个iota连用

      const(
    
        _,_ = iota,iota
        a,b
        c,d
    )

    自定义iota类型:

      const(
    
        _float64 = iota
        a
        b
    )

    算数运算

    ①变量一定义,它的数据类型是确定死了的,不能再变

    ② 100 这样的整型数字存在自动转换为100.0 float64的情况

    ③ 100.0 这样的float型数字存在自动转换为100 int的情况

    ④同类型之间才能进行算数运算

    ⑤算数运算支持十进制、二进制、十六进制

    指针

    指针是存放内存地址的变量

    var a=100
    fmt.Println(&a)    //0x00005680
    var b = &a
    fmt.Println(b)    //*int int类型指针
    获取指针的值方法:*b

     


    请相信自己

    当我们迷茫,懒惰,退缩的时候 我们会格外的相信命运 相信一切都是命中注定

    而当我们努力拼搏,积极向上时 我们会格外的相信自己

    所以命运是什么呢? 它是如果你习惯它 那它就会一直左右你

    如果你想挣脱它 那它就成为你的阻碍 可如果你打破了它 那它就是你人生的垫脚石!


    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

  • 相关阅读:
    java.lang.NoSuchMethodError: org.springframework.web.context.request.ServletRequestAttributes.<init>
    eclipse web项目实际工程路径对应
    java中专业术语详解
    Maven详解
    工作常用
    html页面布局
    jQuery易混淆概念的区别
    Jquery Datagrid
    Jquery EasyUI 动态添加标签页(Tabs)
    sql语句的写法
  • 原文地址:https://www.cnblogs.com/suguangti/p/11446672.html
Copyright © 2020-2023  润新知