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
}