【新人系列】Golang 入门(一):基础介绍
✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html
📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
📚 专栏简介:在这个专栏,我将带着大家从 0 开始入门 Golang 的学习。在这个 Golang 的新人系列专栏下,将会总结 Golang 入门基础的一些知识点,并由浅入深的学习这些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 👍 收藏 📁 关注,您的支持就是我创作的最大动力 💪
1. Go 语言介绍
1.1 Go 语言优势
- 语法简单 - 开发效率高(例如下面短短十行代码就实现了一个简单的 HTTP 服务器)
package main
import (
"net/http"
)
func main() {
http.Handle("/", http.FileServer(http.Dir(".")))
http.ListenAndServer(":8080", nil)
}
-
集各种语言的优势,有丰富的标准库和完善的工具链 - 大量参考 c 和 python
- c 语言:静态类型系统、指针操作等特点
- Python 语言:简洁语法、垃圾回收等优势
-
执行性能高 - 直接编译成二进制,部署非常简单
- 想运行 Python 程序则需要预先安装好 Python
- 想运行 Java 程序则需要预先安装 jdk
- 而想运行 go 程序则不用事先安装任何软件,因为它本身就是 exe 文件可以直接执行
-
并发编程非常高效 - goroutine
-
编译速度快 - 比 C++、Java 编译快
1.2 Go 语言能做什么?
1.2.1 应用场景
-
Web 开发
gin (ginex)、hertz、beego 等
-
容器虚拟化
docker、k8s、istio
-
中间件
etcd、tidb、infuluxdb、nsq 等
-
区块链
以太坊、fabric
-
微服务
kitex、go-zero、dapr、rpcx、kratos、dubbo-go
1.2.2 使用情况
-
国内使用热度超过国外
-
大量国内公司使用
字节跳动、百度、腾讯、阿里、B 站、小米、滴滴、京东、360、七牛云、知乎、美团、OPPO 等
1.3 开发环境
1.3.1 安装 Golang
直接打开浏览器输入 go.dev 网址进行下载即可。
https://go.dev/
如果打不开的话可以尝试使用 Golang 中国的 studygolang 镜像。
https://studygolang.com/dl
另外,如果访问 github 的速度非常慢的话,可以配置 go mod proxy,打开下面的网页按照提示操作即可,配置完成后下载第三方包的速度会大大加快。
https://goproxy.cn/
1.3.2 配置开发环境
常用的 Golang 编辑器 / IDE 有两个,我一般会更习惯 Goland 进行开发~
- vscode
https://code.visualstudio.com/
vscode 是一款由微软开发的,能运行在 Mac、Windows 和 Linux 上的跨平台开源代码编辑器。它可以通过扩展程序为编辑器实现代码高亮、代码提示编译调试、文档生成等功能,配置完成后可以视为一个齐全的 IDE。
- Goland
https://www.jetbrains.com/go/download/#section=windows
Goland 是由 JetBrains 公司开发的一个新的商业 IDE,相比 vscode,它在重构、代码生成等方面做的更好。Goland 是一个收费软件,我们可以直接从官网下载,然后可以 30 天免费试用。
1.3.3 云开发
https://cloud.bytedance.net/cloudide?x-resource-account=public
除了 Gloand 的使用,我大多时间会直接在公司内部的云开发平台写代码,因为可以避免很多环境的问题。但是,有些操作在云平台难以实现,一般都是搭配这本地环境使用。
2. 变量与常量
2.1 定义与使用
2.1.1 命名规则
- 一个名字必须以一个字母(Unicode 字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线
- 大写字母和小写字母是不同的:heapSort 和 Heapsort 是两个不同的名字
- Go 语言程序员推荐使用驼峰式命名,当名字由几个单词组成时优先使用大小写分隔,而不是优先用下划线分隔
- 像 ASCII 和 HTML 这样的缩略词则避免使用大小写混合的写法,它们可能被称为 htmlEscape、HTMLEscape 或 escapeHTML,但不会是 escapeHtm
- Go 语言中类似 if 和 switch 的关键字有 25 个;关键字不能用于自定义名字,只能在特定语法结构中使用
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
变量名可见性
- 如果一个名字是在函数内部定义,那么它就只在函数内部有效。如果是在函数外部定义,那么将在当前包的所有文件中都可以访问。
- 名字的开头字母的大小写决定了名字在包外的可见性。如果一个名字是大写字母开头的,那么它将是导出的,也就是说可以被外部的包访问,例如fmt包的Printf函数就是导出的,可以在fmt包外部访问。
- 包本身的名字一般总是用小写字母。
2.1.2 如何定义变量?
- 变量必须先定义才能使用
- go 语言是静态语言,要求变量的类型和赋值类型一致
- 变量名不能冲突
- 简洁变量定义不能用于全局变量
- 变量是有零值,也就是默认值
- 定义了变量一定要使用,否则会报错
下面声明变量的方式都等价:实践中一般使用前两种形式中的某个,初始值重要的话就显式地指定变量的值,否则指定类型使用隐式初始化。
- 第一种形式,是一条短变量声明,最简洁,但只能用在函数内部,而不能用于包变量。
- 第二种形式依赖于字符串的默认初始化零值机制,被初始化为 “”。
- 第三种形式用得很少,除非同时声明多个变量。
- 第四种形式显式地标明变量的类型,当变量类型与初值类型相同时,类型冗余,但如果两者类型不同,变量类型就必须了。
// 方法一
s := ""
// 方法二
var s string
// 方法三
var s = ""
// 方法四
var s string = ""
注意:
自增语句 i++ 给 i 加 1;这和 i+=1 以及 i=i+1 都是等价的。对应的还有 i-- 给 i 减 1。它们是语句,而不像 C 系的其它语言那样是表达式。所以 j=i++ 非法,而且 ++ 和 – 都只能放在变量名后面,因此 --i 也非法。
2.1.3 常量定义须知
- 常量定义的时候指定的值不能修改,常量尽量大写
- 常量类型只可以定义 bool、数值(整数、浮点数和复数)和字符串
- 不曾使用的常量,没有强制使用的要求
- 显示指定类型的时候,必须确保常量左右值类型一致
- 同时定义多个常量时,需要注意未指明的常量将引用前面定义的值:
const (
x int = 16
y
s = "abc"
z
m
)
fmt.Println(x, y, s, z, m) //16 16 abc abc abc
2.2 iota 的使用细节
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
const(
ERR1 = iota
ERR2
ERR25
ERR3
)
fmt.Println(ERR1, ERR2, ERR25, ERR3) //0 1 2 3
const(
ERR1 = iota + 1
ERR2
ERR25 = "ha"
ERR3
ERR4 = iota
)
fmt.Println(ERR1, ERR2, ERR25, ERR3, ERR4) //1 2 ha ha 4
注意:
- 如果中断了 iota,那么必须显示的恢复,后续会自动递增
- 自增类型默认是 int 类型
- iota 能简化 const 类型的定义
- 每次出现 const 的时候,iota 初始化为 0
2.3 匿名变量的定义与使用
匿名变量是一种特殊的变量,使用 _
表示,它只占位不存储值,可用于忽略函数返回值中不需要的部分,或者在多重赋值中丢弃不需要的变量。
//匿名变量
var _ int
func a() (int, bool){
return 0, false
}
_, ok := a()
if ok {
//打印
}