Golang入门

2,019 阅读6分钟

安装与配置

Golang社区或官网下载对应的安装包,安装并配置环境变量。

以我的电脑win10系统为例:
我安装的是go1.14.4(windows)版本,傻瓜式安装,一路next。默认安装在C盘,但是因为我的C盘已经有太多内容了,我把安装目录更改为D:\GO1.14.4

这里的安装目录也就是下文要配置的GOROOT。

安装结束后,打开命令行工具输入go env,如果显示如下内容说明安装成功。

配置环境变量GOPATH、GOROOT:

方法一:打开git bash命令,注意是git bash!!!

export GOPATH="E:\Go" # Go的安装目录
export GOROOT="D:\Go1.14.4" #不要和安装目录放在同一个目录
export GOPROXY="https://proxy.golang.org,direct" #因为qiang,配置仓库镜像库

方法二:手动配置

  1. 我的电脑,右击 -> 属性 -> 高级系统设置 -> 环境变量;
  2. 系统变量 -> 编辑 -> 添加变量值;
  3. GOPATH: E:\Go 项目空间路径,这里因为E盘空间大,我就放在E盘了
  4. GOROOT:D:\GO1.14.4,第一步项目包安装的路径

vscode编辑器配置

  • 点击右侧扩展面板,搜索并安装Go扩展
  • 因为qiang,Go的语法插件需要从github.com、golang.cn等网站上下载代码包安装,具体方法请参考blog

编码规范

当我费了九牛二虎之力安装好源码、配置好环境,敲下第一行"hello world"时

package main

import "fmt"

func main() {
   fmt.Println('Hello, World!')
}

报错了!!

我一个字母一个字母的检查,没错呀!终于,当我把单引号换成双引号时,跑起来了!

对于一个前端鹅来说,什么单引号双引号,还不都是引号。在接来下的学习中我也深刻体验到了不同语言之间的区别,动态语言和静态语言真的不一样!

命令规范

  1. 区分大小写

当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);
命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )

  1. 包命名:小写单词,不要使用下划线或者混合大小写;包的名字和目录保持一致
  2. 文件命名:小写,使用下划线分隔各个单词
  3. 结构体命名:驼峰法,首字母根据访问控制大写或者小写
  4. 接口命名:驼峰法,首字母根据访问控制大写或者小写
  5. 变量命名:驼峰法,首字母根据访问控制原则大写或者小写;若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
var name string = "abc"
var hasConflict bool
  1. 常量命名:全部大写字母组成,并使用下划线分词
const APP_VER = "1.0"

注释规范

  • 单行注释:最常见的注释形式,以 // 开头。
  • 多行注释也叫块注释,均已以 / 开头,并以 / 结尾,且不可以嵌套使用,多行注释一般用于包的文档描述或注释成块的代码片段。
每个包都应该有一个包注释,在package子句之前有一个块注释。对于多文件包,包注释只需要存在于一个文件中,任何一个都可以。包评论应该介绍包,并提供与整个包相关的信息。

go 语言自带的 godoc 工具可以根据注释生成文档。

代码风格

  1. 不需要冒号结尾。如果你打算将多个语句写在同一行,它们则必须使用冒号
  2. 缩进直接使用 gofmt 工具格式化即可(gofmt 是使用 tab 缩进的)
  3. 错误处理
    • 不能丢弃任何有返回err的调用
    • 尽早return
    • 尽量不要使用panic,除非你知道你在做什么
    • 错误描述如果是英文必须为小写,不需要标点结尾
    • 采用独立的错误流进行处理

基本概念

  • 工作区workplace

    GOPATH所在的目录,一个或多个。工作区用来放置 Go 语言的源码文件(source file),以及安装后的归档文件(archive file,也就是以“.a”为扩展名的文件)和可执行文件(executable file)。

  • 代码包

    拥有源码文件的目录。一个代码包中可以包含任意个以.go 为扩展名的源码文件,这些源码文件都需要被声明属于同一个代码包。一个代码包的导入路径实际上就是从 src 子目录到该包的实际存储位置的相对路径。

  • 代码块

    代码块一般就是一个由花括号括起来的区域,里面可以包含表达式和语句。Go 语言本身以及我们编写的代码共同形成了一个非常大的代码块,也叫全域代码块。每个源码文件也都是一个代码块,每个函数也是一个代码块,每个if语句、for语句、switch语句和select语句都是一个代码块。甚至,switch或select语句中的case子句也都是独立的代码块。

  • 程序实体

    包括变量var、常量const、函数func、结构体struct和接口interface。

  • 字面量

    表示数据类型本身的若干个字符。比如[]string这个字面量表示一个数据类型为string类型的切片;map[int]string表示键类型为int、值类型为string的字典...

  • 类型断言表达式

  • 类型推断

    是一种编程语言在编译期自动解释表达式类型的能力(表达式类型就是对表达式进行求值后得到结果的类型)。只能用于对变量或常量的初始化。例如:

    /* 
    b明确了类型是string;
    a并没有确定其类型,Go语言根据类型推断也认为其数据类型是string
    */
    var a = "Hello" 
    var b string = "World"
    

    Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。

    对于jser来说,类型推断我熟。在js中的变量都是类型推断,从来没有明确定义过类型。为什么这里要强调类型呢?这涉及到语言的体系问题了。 Go 语言是静态类型的,所以一旦在初始化变量时确定了它的类型,之后就不可能再改变。这就避免了在后面维护程序时的一些问题。而JS是动态类型的,没有编译的概念,所以JS语法很灵(sui)活(bian),这也是js程序比较难维护的原因。