所有项目均为Windows + VSCode + go环境下创建
这并不是一篇从完全意义上的小白开始学习的博文,看这篇博文之前还是需要一丁点的go的知识点的,比如第一个Golang程序“HelloGo”怎么写等等,甚至包括环境搭建啥的,这种我就不写了,毕竟随便一搜索就是大把的资料。
// Hello Go
package main
import (
"fmt"
)
func main() {
fmt.Printf("Hello Go")
}
如果想要在外部调用某个包内部的函数/变量,需要命名时首字母大写
func funcName(FormalParameterList) ReturnValueList {
FuncBody
}
func add(a int, b int) int {
return a + b
}
type typeName func(FormalParameterList) ReturnValueList
package main
import "fmt"
//type opFunc func(int, int) int
func add(a, b int) int {
return a + b
}
//func operator(op opFunc, a, b int) int {
func operator(op func(int, int) int, a, b int) int {
return op(a, b)
}
func main() {
c := add
sum := operator(c, 100, 200)
fmt.Println(sum)
}
/*
output:
API server listening at: 127.0.0.1:14310
300
Process exiting with code: 0
*/
返回值列表必须使用“()”括起来
// base example:
// calc returns the sum and average of two numbers
func calc(a int, b int)(int, int) {
sum := a + b
avg := (a + b) / 2
return sum, avg
}
// usage:
sum, avg = calc(10, 20)
// 如果有部分返回值不使用,可以使用“_”占位
_, avg = calc(10, 20)
在定义函数时,直接命名返回值,这样可以在返回时,直接只写一个return
package main
import (
"fmt"
)
// getPerimeterArea returns the circumference and area of a rectangle
func getPerimeterArea(width int, height int) (perimeter int, area int) {
perimeter = width*2 + height*2
area = width * height
return
}
func main() {
//var perimeter, area = getPerimeterArea(100, 50)
perimeter, area := getPerimeterArea(100, 50)
fmt.Println("The rectangle's perimeter is: ", perimeter, ", area is: ", area)
}
/*
output:
API server listening at: 127.0.0.1:8161
The rectangle's perimeter is: 300 , area is: 5000
Process exiting with code: 0
*/
单返回值参数也可以命名,一旦命名,不论是单返回值还是多返回值,都必须使用“()”括起来
func FuncName1(arg...int) int {
// 0个或多个参数
}
func FuncName2(a int, arg...int) int {
// 1个或多个参数
}
func FuncName3(a int, b int, arg...int) int {
// 2个或多个参数
}
package main
import (
"fmt"
)
func add(a int, arg ...int) int {
var sum int = a
for i := 0; i < len(arg); i++ {
sum += arg[i]
}
return sum
}
func addString(a string, arg ...string) (result string) {
result = a
for i := 0; i < len(arg); i++ {
result += arg[i]
}
return
}
func main() {
sum := add(10)
fmt.Println(sum)
result := addString("Hello", " ", "Go", "!")
fmt.Println(result)
}
/*
output:
API server listening at: 127.0.0.1:42029
10
Hello Go!
Process exiting with code: 0
*/
defer
语句,因此可以用来清理资源package main
import (
"fmt"
)
func main() {
var i int = 0
defer fmt.Println("i = ", i)
i++
for j := 0; j < 3; j++ {
defer fmt.Println("j = ", j)
}
}
/*
output:
API server listening at: 127.0.0.1:2584
j = 2
j = 1
j = 0
i = 0
Process exiting with code: 0
*/
package main
import (
"fmt"
)
func test(a, b int) int {
result := func(a1, b1 int) int {
return a1 + b1
}(a, b) //此处使用小括号说明在定义这个匿名函数的同时调用了它
return result
}
func main() {
fmt.Println(test(100, 300))
}
/*
output:
API server listening at: 127.0.0.1:32747
400
Process exiting with code: 0
*/
不需要导入任何包也不需要定义就可以直接使用的函数
函数名 | 功能 |
---|---|
close | 主要用来关闭channel |
len | 用来求长度,比如string、arrav、slice、map、channel |
new | 用来分配内存,主要用来分配值类型,比如int、struct |
make | 用来分配内存,主要用来分配引用类型,比如chan、map、slice |
append | 用来追加元素到数组、slice中 |
copy | 拷贝 |
panic和recover | 用来做错误处理 |
//new
package main
import (
"fmt"
)
func main() {
a := new(int)
*a = 100
fmt.Println(a)
fmt.Println(*a)
}
/*
output:
API server listening at: 127.0.0.1:47147
0xc0000120b8
100
Process exiting with code: 0
*/
//make
package main
import (
"fmt"
)
func main() {
pipe :=