介绍
- Go 即 Golang,是 Google 公司 2009 年 11 月正式对外公开的一门编程语言。
- 根据 Go 语言开发者自述,近 10 多年,从单机时代的 C 语言到现在互联网时代的 Java,都没有令人满意的开发语言,而 C++往往给人的感觉是,花了 100%的经历,却只有 60%的开发效率,产出比太低,Java 和 C#的哲学又来源于 C++。
- 并且,随着硬件的不断升级,这些 语言不能充分的利用硬件及 CPU。
- 因此,一门高效、简洁、开源的语言诞生了。
- Go 语言不仅拥有静态编译语言的安全和高性能,而且又达到了动态语言开发速度和易 维护性。
- 有人形容 Go 语言:Go = C + Python , 说明 Go 语言既有 C 语言程序的运行速度,又能达到 Python 语言的快速开发。
- Go 语言是非常有潜力的语言,是因为它的应用场景是目前互联网非常热门的几个领域比如 WEB 开发、区块链开发、大型游戏服务端开发、分布式/云计算开发。
- 国内比较知名的B 站就是用 Go 语言开发的,像 Goggle、阿里、京东、百度、腾讯、小米、360 的很多应用也是使用 Go 语言开发的。
命名规范
Go是一门区分大小写的语言。命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 private )
-
包名称
- 保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
package domain package main
- 保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。包名应该为小写单词,不要使用下划线或者混合大小写。
-
文件命名
- 尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
approve_service.go
- 尽量采取有意义的文件名,简短,有意义,应该为小写单词,使用下划线分隔各个单词。
-
结构体命名
- 采用驼峰命名法,首字母根据访问控制大写或者小写
struct
申明和初始化格式采用多行,例如下面:type MainConfig struct { Port string `json:"port"` Address string `json:"address"` }
- 采用驼峰命名法,首字母根据访问控制大写或者小写
-
接口命名命名规则基本和上面的结构体类型单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer 。
- 命名以“er”结尾,如:
Writer
,xxxHandler
,Helper
,Manager
等 - 接口方法声明 = 方法名+方法签名如:
methodA (param1, param2)outputTypeList
type Reader interface { Read(p []byte) (n int, err error) }
- 命名以“er”结尾,如:
-
变量命名
- 和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写
- 但遇到特有名词时,需要遵循以下规则:如果变量为私有,且特有名词为首个单词,则使用小写
- 如 appService若变量类型为 bool 类型,则名称应以
Has
,Is
,Can
或Allow
开头var isExist bool var hasConflict bool var canManage bool var allowGitHook bool
常量命名常量均需使用全部大写字母组成,并使用下划线分词
const APP_URL = " https://www.baidu.com "
如果是枚举类型的常量,需要先创建相应类型:
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
golang中关键字
var
和const
:变量和常量的声明
package
and import
: 导入
func
: 用于定义函数和方法
return
:用于从函数返回
defer someCode
:在函数退出之前执行
go
: 用于并行
select
用于选择不同类型的通讯
interface
用于定义接口
struct
用于定义抽象数据类型
break
、case
、continue
、for
、fallthrough
、else
、if
、switch
、goto
、default
流程控制
chan
用于channel通讯
type
用于声明自定义类型
map
用于声明map类型数据
range
用于读取slice
、map
、channel
数据
注释
多行注释用/* */
单行注释 //
在goland中注释快捷键为:ctrl
+/
GO main
函数和init
函数
package main
import "fmt"
func main() {
fmt.Println("Hello world")
}
在同一个包中仅允许有一个main函数,main函数是整个程序的入口,而且必须存在。此时package
后面也必须跟main
go语言中 init 函数用于包 (package) 的初始化,该函数是go语言的一个重要特性。
有下面的特征:
- 1、init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
- 2、每个包可以拥有多个init函数
- 3、包的每个源文件也可以拥有多个init函数
- 4、同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
- 5、不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
- 6、init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
init
函数和main
函数的异同
相同点:
两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
init
可以应用于任意包中,且可以重复定义多个。main
函数只能用于main包中,且只能定义一个。- 两个函数的执行顺序:
对同一个go文件的init()
调用顺序是从上到下的。
对同一个package中不同文件是按文件名字符串比较“从小到大”顺序调用各文件中的init()
函数。
对于不同的package,如果不相互依赖的话,按照main包中”先import的后调用”的顺序调用其包中的init()
如果package存在依赖,则先调用最早被依赖的package中的init()
,最后调用main函数。
如果init函数中使用了println()
或者print()
你会发现在执行过程中这两个不会按照你想象中的顺序执行。
这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。
init()
函数介绍
在Go语言程序执行时导入包语句会自动触发包内部init()
函数的调用。
需要注意的是: init()
函数没有参数也没有返回值。
init()
函数在程序运行时自动被调用执行,不能在代码中主动调用它。
包初始化执行的顺序如下图所示:
变量
在go中定义变量的形式有三种,在go语言中,定义的变量必须要使用,否则会报错。
标准的语法:var 变量名 变量类型 = 变量值
第一种形式:
var num int = 100
第二种形式:
num2 := 100 // (最常用的)
第二种形式也是我们推荐在生产环境中使用的,简洁。
第三种形式:
var num3 int // (先定义类型然后赋值,全局变量初始化)
num3 = 100
fmt.Println(num3)
批量定义变量
批量定义多个变量时,变量的类型是相同的,定义后再对变量进行赋值。
var num4, num5 int
num4 = 100
num5 = 100
fmt.Println(num4, num5)
如果定义的这批量变中类型不尽相同时,可以使用var进行批量声明变量的类型
var (
name string
age int
)
name = "zhangsan"
age = 24
fmt.Println(name, age)
常量
在GO语言中,定义的常量无法改变,以实际项目中一般用于定义一些环境变量和配置等。这一点和python还不一样,需要注意。
const num10 = 100
//num10 = 200 // 常量一旦定义,不可修改
num11 := 100 // 变量可以修改同一种类型数据
num11 = 200
//num11 = "zhangsan" // 不能将一个int类型的数据,修改成其他类型
fmt.Println(num10, num11)
批量定义常量
const (
// 在同一个代码块里,相同的变量名字不能同时指定为变量和常量
//name string = "zhangsan"
age1 = 26
)
fmt.Println(name, age)