写给自己的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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容