golang 知识点汇总
1. 命名规范及大小写的访问权限
- golang的命名需要使用驼峰命名法,且不能出现下划线。
- golang中根据首字母的大小写来确定可以访问的权限。无论是函数名称、方法名称、常量名称、变量名称还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。可以简单的理解成,首字母大写是公有的,首字母小写是私有的。
- 结构体中属性名的大写
如果属性名小写则在数据解析(如json解析,或将结构体作为请求或访问参数)时无法解析。
2. 两个特殊的函数
在golang中有两个特殊的函数,main函数和init函数。
main函数是一个程序的入口,只能有一个。
init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数),init函数在我们导入该package时程序会自动调用,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。
3. =和:=的区别
= 用于给变量赋值,这个被赋值的变量一定要是一个已经被定义过的变量,否则会报错。
:= 用于定义变量,同时给变量赋值。
4. 定义变量
标准格式:
var 变量名 变量类型
简短格式:
变量名 := 初始值
注意:简短模式有以下限制
- 定义变量,同时显式初始化。
- 不能提供数据类型。
- 只能用在函数内部。
批量格式:
var (
变量名1 变量类型
变量名2 变量类型
变量名3 变量类型
)
5. 定义常量
标准格式:
const 常量名称 常量类型 = 初始值
简短格式:
const 常量名称 = 初始值
批量格式:
const (
常量名称1 = 初始值
常量名称2 = 初始值
常量名称3 = 初始值
)
注意:常量的初始值类型只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
6. 全局变量和局部变量
全局变量:在函数体外声明的变量称之为全局变量,全局变量可以在程序的任何地方使用,包括在当前包和外部包(被导出后)中使用。
局部变量:在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
注意:全局变量与局部变量名称可以相同,名称相同时,局部变量会被优先考虑。
7. 定义数组
// 元素类型为字符串
var arr []string;
// 元素类型不固定
var arr []interface{};
// 动态添加元素
arr = append(arr, 元素)
8. 遍历数组
for index, value := range arr变量{
}
9. 定义map
// 创建map,map元素类型为字符串
m := make(map[string]string)
// 创建map,map元素类型不固定
m := make(map[string]interface{})
// 设置map内容
m["id"] = 1
m["name"] = "名称"
// 将map元素放在数组中
var arr []interface{};
arr = append(arr, m)
10. 遍历map
for key, value := range map变量 {
}
11. 定义函数类型
type 函数名称 func(参数) 返回值类型
示例:
type FormatNumber func(number int) string
12. 定义函数
// 定义函数
func 函数名称() 返回值类型 {
}
13 定义结构体及方法
// 定义结构体
type 结构体名称 struct {}
// 定义结构体中的方法
func (结构体名称) 方法名称() 返回值类型 {
}
示例:
type Utils struct {}
func (Utils) GetRootPath() string {
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
return strings.Replace(dir, "\\", "/", -1)
}
调用结构体方法:
总共分2步,第1步、初始化结构体
方法一:var utils = new(Utils)
方法二:var utils = Utils{}
第2步、调用方法
utils.GetRootPath()
也可以连起来写成:Utils{}.GetRootPath()
14. 获取项目根路径
// 获取项目根路径
func GetRootPath() string {
dir, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
return strings.Replace(dir, "\\", "/", -1)
}
15. 判断变量类型
if reflect.TypeOf(变量).Kind() == reflect.类型名 {
}
示例:判断变量t的类型是否为int64
if reflect.TypeOf(t).Kind() == reflect.Int64 {
}
16. 时间戳格式化
func FormatUnix(t int64) string {
// 转化所需模板,此处必须是2006-01-02 15:04:05(go的诞生时间)
timeLayout := "2006-01-02 15:04:05"
datetime := time.Unix(t, 0).Format(timeLayout)
return datetime
}