变量定义方法
var定义变量
var 变量名 类型 = 表达式
var name string = "zhangsan"
var age int =21
var isOk bool bool
类型推导方式定义变量
a 在函数内部,可以使用更简略的 := 方式声明并初始化变量。
注意:短变量只能用于声明局部变量,不能用于全局变量的声明
// 变量名 := 表达式
n := 10
var age = 18
一次定义多个变量
package main
import "fmt"
func main() {
var username, sex string
username = "张三"
sex = "男"
fmt.Println(username, sex)
}
批量声明变量
package main
import "fmt"
func main() {
var (
a string
b int
c bool
)
a = "张三"
b = 10
c = true
fmt.Println(a, b, c)
}
常量定义
声明了 pi 和 e 这两个常量之后,在整个程序运行期间它们的值都不能再发生变化了。
const pi = 3.1415
const e = 2.7182
// 多个常量也可以一起声明
const (
pi = 3.1415
e = 2.7182
)
const 同时声明多个常量时,如果省略了值则表示和上面一行的值相同。
const (
n1 = 100
n2
n3
)
// 上面示例中,常量 n1、n2、n3 的值都是 100
fmt包
Println:
一次输入多个值的时候 Println 中间有空格
Println 会自动换行,Print 不会
Print:
一次输入多个值的时候 Print 没有 中间有空格
Print 不会自动换行
Printf
Printf 是格式化输出,在很多场景下比 Println 更方便
package main
import "fmt"
func main() {
fmt.Print("zhangsan", "lisi", "wangwu") // zhangsanlisiwangwu
fmt.Println("zhangsan", "lisi", "wangwu") // zhangsan lisi wangwu
name := "zhangsan"
age := 20
fmt.Printf("%s 今年 %d 岁", name, age) // zhangsan 今年 20 岁 }
}
Init函数和main函数
init函数
go语言中 init 函数用于包 (package) 的初始化,该函数是go语言的一个重要特性。
有下面的特征:
init函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等
每个包可以拥有多个init函数
包的每个源文件也可以拥有多个init函数
同一个包中多个init函数的执行顺序go语言没有明确的定义(说明)
不同包的init函数按照包导入的依赖关系决定该初始化函数的执行顺序
init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
main函数
// Go语言程序的默认入口函数(主函数):func main()
// 函数体用{}一对括号包裹
func main(){
//函数体
}
init函数和main函数的异同
相同点:
两个函数在定义时不能有任何的参数和返回值,且Go程序自动调用。
不同点:
init可以应用于任意包中,且可以**
重复
**定义多个。main函数只能用于main包中,且只能定义
一个
。两个函数的执行顺序:
对
同一个
go文件的 init() 调用顺序是从上到下
的。
对同一个package中不同文件是按
文件名字符串
比较从小到大
顺序调用各文件中的 init() 函数。对于不同的 package ,如果不相互依赖的话,按照main包中"`先 import 的后调用"的顺序调用其包中的 init()
如果 package 存在依赖,则先调用最早被依赖的 package 中的 init() ,最后调用 main 函数。
如果 init 函数中使用了 println() 或者 print() 你会发现在执行过程中这两个不会按照你想象中的顺序执行。
这两个函数官方只推荐在测试环境中使用,对于正式环境不要使用。
init()函数介绍
1、在Go语言程序执行时导入包语句
会自动触发包内部 init() 函数的调用。
2、需要注意的是:init() 函数没有参数
也没有返回值
。
3、init() 函数在程序运行时自动
被调用执行,不能
在代码中主动调用它。
4、包初始化执行的顺序如下图所示:
全局声明 ——> init() ——> main()
golang中关键字
go语言共计25个关键字
var和const
变量和常量的声明package and import
导入func
用于定义函数和方法return
用于从函数返回defer
在函数退出之前执行go
用于并行select
用于选择不同类型的通讯interface
用于定义接口struct
用于定义抽象数据类型break、case、continue、for、fallthrough、else、if、switch、goto、default
流程控制chan
用于channel通讯type
用于声明自定义类型map
用于声明map类型数据range
用于读取slice、map、channel数据
命名规范
Go是一门区分大小写
的语言。命名规则涉及变量、常量、全局函数、结构、接口、方法等的命名。 Go语言从语法层面进行了以下限定:任何需要对外暴露
的名字必须以大写字母
开头,不需要对外暴露的则应该以小写字母开头。当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Analysize,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public);命名如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的private)
包名称
保持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)
}
变量命名
和结构体类似,变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写
但遇到特有名词时,需要遵循以下规则:如果变量为私有,且特有名词为首个单词,则使用小写
如 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"
如果是枚举类型的常量,需要先创建相应类型:
type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)