1 背景和综述
-
作者作为校招新人入职,公司用Golang, 自己有Java、PHP的 Web 开经验,熟悉前端的Vue技术栈,在此之前没写过Golang项目,只是几个月前按照菜鸟教程看了一遍Golang的语法 ,了解其天生高并发的特性,知道其有协程、管道这两个重要的特性。
-
入职当天就要求自学做一个Golang的新手村任务,做一个分布式的在2000并发访问下能够做到1000QPS的登录注册,期限一周,要求细节不便透露,这里就不详细展开了,本文所分享的干货主要来自于这个新手村任务的积累。
-
Golang 语法入门很简单,但是根据我的入门经验,最容易对初学者造成困扰的是代码的组织形式,稍有语法基础的读者建议直接看 2.2 代码组织部分。
2 Golang 的常用语法以及代码组织
2.1 语法
- 如果你曾经系统地看过Golang的语法,那么这里我向你推荐 y 分钟学会 x语言系列教程,以及其搬运的国内版本,通过这个可以快速地把语法复习一遍(语法没必要背,都是用的多了就记住了)
- 如果你不曾系统看过Golang语法,那么没关系,认真看完下面这个代码,就足够了
// 单行注释
/* 多行
注释 */
// go的IDE我推荐Vscode,Goland也不错,前者我自用,后者同同事都在用
// 用 go 开发时注释中也会经常见到文档注解,如 @Version 1.0.0
// 导入包的子句在每个源文件的开头。
// Main比较特殊,它用来声明可执行文件,而不是一个库。
package main
// Import语句声明了当前文件引用的包。
import (
"fmt" // Go语言标准库中的包
"net/http" // 一个web服务器包
"strconv" // 字符串转换
"strings" // 字符串标准库
)
// 等你写习惯了go不带分好,写Java会很变扭
// 函数声明:Main是程序执行的入口。
// 不管你喜欢还是不喜欢,反正Go就用了花括号来包住函数体,花括号配合严格的缩进,代码非常易读。
func main() {
// 往标准输出打印一行。
// 用包名fmt限制打印函数。
fmt.Println("Hello world!")
// 写项目时用 log.Println("Hello world!") 会更多
// 调用当前包的另一个函数。
beyondHello()
}
// 函数可以在括号里加参数。
// 如果没有参数的话,也需要一个空括号。
func beyondHello() {
var x int // 变量声明,变量必须在使用之前声明。
x = 3 // 变量赋值。
// 可以用:=来偷懒,它自动把变量类型、声明和赋值都搞定了,这个在项目中最常用。
y := 4
sum, prod := learnMultiple(x, y) // 返回多个变量的函数
fmt.Println("sum:", sum, "prod:", prod) // 简单输出
learnTypes() // 少于y分钟,学的更多!
}
// 多变量和多返回值的函数
func learnMultiple(x, y int) (sum, prod int) {
return x + y, x * y // 返回两个值
/*
// 因为这里返回值不仅有类型,还写了名称,因此函数体其实还可以这么写
sum = x + y // 注意这里不是 :=
prod = x * y
return
*/
}
// 内置变量类型和关键词
func learnTypes() {
// 短声明给你所想。
s := "Learn Go!" // String类型
s2 := `A "raw" string literal
can include line breaks.` // 同样是String类型
// 非ascii字符。Go使用UTF-8编码。
g := 'Σ' // rune类型,int32的别名,使用UTF-8编码
f := 3.14195 // float64类型,IEEE-754 64位浮点数
c := 3 + 4i // complex128类型,内部使用两个float64表示
// Var变量可以直接初始化。
var u uint = 7 // unsigned 无符号变量,但是实现依赖int型变量的长度
var pi float32 = 22. / 7
// 字符转换
n := byte('\n') // byte是uint8的别名
// 数组类型编译的时候大小固定。
var a4 [4] int // 有4个int变量的数组,初始为0
a3 := [...]int{
3, 1, 5} // 有3个int变量的数组,同时进行了初始化
// Slice 可以动态的增删。Array和Slice各有千秋,但是使用slice的地方更多些。
s3 := []int{
4, 5, 9} // 和a3相比,这里没有省略号
s4 := make([]int, 4) // 分配一个有4个int型变量的slice,全部被初始化为0
// 常见操作
str := "带加豪,偶稀渣渣辉"
bs := []byte(str) // 字符串转化为byte切片
str2 := string(bs) // byte切片转字符串
println(str, len(str), bs, len(bs), str2, strings.Count(str, "")-1) // println函数更像 Java的 sysout
fmt.Println(str, len(str), bs, len(bs), str2