写给自己的Go学习手册(0)

前言

本人是.Net/C#开发小白,在大佬们的建议下,开始学习Go语言,特此记录下自己的学习过程。
由于本文时自己参考书籍以及网络资料写的,如果有错误,请大佬指出,我感谢不尽

Go的Hello World

作为最常用最喜欢的入门第一段程序就是输出Hello Wrold啦,这里直接贴代码给上。

package main

import "fmt"

func main() {
    fmt.Println("Hello World")
}

将上述代码内容复制到go后缀的文件中,如main.go,将终端路径定位到文件上级,输入指令
go run main.go
就可以看到万众期待的Hello World啦

关于Go的安装和配置

Golang的安装十分简单,可以点击此处链接到达下载页面。此处建议下载Go1.13以上版本进行学习和开发。本文使用的Go版本是基于1.17进行编写的。
安装完毕之后,开发者要及时将Go的bin目录添加到环境变量的path中。

Go的环境变量设置

使用Go指令go env,既可以查看当前Go的环境变量设置。
go env
这里给出比较推荐的Go全局环境变量设置

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

第一行是开启自Go1.11版本开始,并且至今也比较流行的Go module 包管理工具。
第二行是切换到七牛云Go下载代理地址,可以加快国内环境的包获取速度。

Go常用指令及其一般功能介绍

1.go help

在终端输入该指令可以获得所有go指令的介绍和使用说明。

2.go env

该指令可以获得当前目录环境下的go环境变量数据,也可以通过该指令来更改全局或者当前局部的环境变量。

3.go mod init XXX

对当前环境的下创建model为XXX的go.mod文件,即使用gomod包管理工具,一般是一个项目的起点。

4. go mod tidy

主动添加需要用到但go.mod中查不到的模块。

5. go run xxx.go

编译并执行xxx.go的main方法。

6. go build xxx.go(该文件下有main方法)

一般用于编辑和打包生产可执行文件,会根据设置的环境变量的OS属性生成不同系统适用的可执行文件。

7. go get XXXXX

用于获取XXX地址的包。

8. go version

用于查看当前go版本

Go的文件格式说明

package main

import "fmt"

const (
    PI = 3.14
)

var (
    name = "icesfeaters"
)

func init() {
    fmt.Println("init")
}

func main() {
    fmt.Println("Hello World")
}

package 包

包的特性如下:

  • 一个目录下的同级文件归属一个包。
  • 包名可以与其目录不同名。
  • 包名为 main 的包为应用程序的入口包,编译源码没有 main 包时,将无法编译输出可执行的文件。只有main包下的main函数才是程序的入口。

import 导入包

当前程序需要使用到其他包的方法时,需要在import中声明,并且可以在import中自定义指定方法名来使用,如下方程序所示。该处理方式主要用于解决1.压缩包名;2.解决不同包直接的命名冲突问题。

import (
    fmtkk "fmt"
)

func main()  {
    fmtkk.Println("hello world")
}

匿名包

存在部分包,需要该包的初始化,但实际程序编写并不会使用的情况,比如:数据库驱动方法包。则需要使用匿名包写法来声明,写法如下。

import (
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
//此处声明的是mysql驱动包

const 全局常量声明

先说明常量的概念:常量:只能读,不能修改,声明时必须确定值,且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量声明的完整写法如下:const thisNum int = 9
其中[type] (int)字段,Go可以根据后面的值来判断并自动识别声明,所以可以省略。
注意点:常量声明中,只能使用=,不能使用:=

var 全局变量声明

全局变量声明必须携带关键字var,并且只能使用=,不能使用:=
全局变量的声明的完整写法如下:var thisNum int = 10
与常量声明不同之处在于:

  • 全局变量声明可以不给予初始值,但相对的必须声明参数类型,如var thisNum int
  • 变量的类型不仅限于基础类型,包括func(),interface{},struct{}等。

init 初始化方法

init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。
init 函数通常被用来:

  • 对变量进行初始化
  • 检查/修复程序的状态
  • 注册
  • 运行一次计算

初始化顺序规则: (1)引入的包 (2) 当前包中的变量常量 (3) 当前包的init (4)main函数

go初始化顺序示意图.jpg

注意init()函数不能被主动调用!
当出现多个init()函数时,安装声明的先后顺序依次执行,测试程序如下:

package main

import "fmt"

func init() {
    fmt.Println("init1")
}

func init() {
    fmt.Println("init2")
}

func main() {
    fmt.Println("main")
}

输出结果

init1
init2
main

函数声明

此处仅列出函数声明的完整格式,具体方法说明后续内容会说明
func funcName(param1 type,param2 type ...)(res1 type,res2 type ...){}

到时候会将跳转地址在此处列出

额外说明

  1. Go如何区分公有权限和私有权限

go中根据首字母的大小写来确定可以访问的权限。无论是方法名、常量、变量名还是结构体的名称,如果首字母大写,则可以被其他的包访问;如果首字母小写,则只能在本包中使用。
可以简单的理解成,首字母大写是公有的,首字母小写是私有的

  1. 关于Go的定义未使用问题

在Go中,禁止出现未被使用的包、未被使用的局部变量,所以在学习使用Go的时候要额外注意这一点。

Go的关键字列举

  • 包相关:import,package
  • 声明相关:var,const,type,struct,interface,func,chan,map,go
  • 循环相关:for,range
  • 条件判断相关:if,else,switch,select,case
  • 中断或返回:return,goto,fallthrough,break,default,continue
  • 延迟执行:defer
  • 预声明常量:true,false,iota,nil
  • 预声明类型:(整型)int,int8,int16,int32,int64;(无符号整型)uint,uint8,uint16,uint32,uint64,uintptr;(浮点型)float32,float64,complex64,complex128;(其他)bool,byte,rune,string,error
  • 预声明函数:make,len,cap,new,append,copy,close,delete,complex,real,imag,panic,recover

你可能感兴趣的:(写给自己的Go学习手册(0))