输出
1、刚开始接触,GO的输出还挺多,在最常用的两个方面做了比较😀
- 纯文本输出
fmt.Println("hello world!")
fmt.Print("hello world!!\n")
fmt.Printf("hello world!!!\n")
//res
hello world!
hello world!!
hello world!!!
- 携带变量输出
var a int = 1
var b = 2
var c = 3
fmt.Println("hello world! like:", a,"wo",b,"再来一杯")
fmt.Print(a,"wo",c,"不喝了","不喝了","\n")
fmt.Printf("the %d times to say hello world!!! \n", c)
//res
hello world! like: 1 wo 2 再来一杯
1wo3不喝了不喝了
the 3 times to say hello world!!!
- summary:
fmt.Println("")
适合输出像python列表那种形式的内容
fmt.Printf("")
前者的不换行,并且不同类型的内容输出时间会拼接或者间隔
fmt.Print("")
和c语言的printf非常类似
2、fmt.Printf("%v %T",a,a)
输出 a 的值和类型 %d %s等等也是支持的,%v是通用的
3、支出复数输出(后面再学)
函数
1、go 语言return
不是原子操作,在底层分为两步执行
- 第一步,返回值赋值
- 第二步,真正的
return
返回 - 函数中,如果存在
defer
,那么defer
执行的时机是在第一步和第二步之间
2、defer
调用遵循栈的规则,怕忘记某条语句最后执行,最先把它写出来加上defer
,表示延迟执行
3、返回多个值
4、自执行函数、匿名函数(gin框架里自执行)
内置函数
1、错误机制,panic("error!")
(有时间再学)
变量
1、类型别名(有空再学)
接口
1、不关心变量类型,只关心能调用它的方法
2、接口是一种特殊的类型它规定了变量有哪些方法
package main
import (
"fmt"
)
type speaker interface{
speak()
}
type cat struct{}
type dog struct{}
func (d dog) speak() {//方法,(规定:接收者首字母d 接收者:dog)
fmt.Println("www")
}
func (c cat) speak(){
fmt.Println("mmm")
}
func da(x speaker){
x.speak()
}
func main() {
var d1 dog
var c1 cat
da(d1)
da(c1)
}
3、面向过程编程(随意),面向对象编程(臃肿),面向接口编程
并发
1、goroutine,用户态线程、100 000 个是可以的,优雅的等待并行结束,启动时需要时间和资源,防止在main结束后还没有结束而被迫结束,所以要等待wg.add()``wg.down()``wg.wait()
,相比sleep()
要优雅的多,结束间隔没有那么突兀,
2、GMP,不学,默认跑满,效率高,使用GMP可用于测试,日志收集
3、一个软件,通常对应一个进程,但可以跑在多个线程中,
go mod
1、go.1.11后,最新的包管理工具go mod
2、开启GO111MODULE=on
模块支持后,包目录会变,如gin,变为pkg/mod/github.com
,而不再是直接pkg/github.com
3、启动gin
,目前用的vscode,执行run code
是不可以的!!会提示找不到包,使用原始的go build main.go
和 ./main
来启动,
闭包
1、
package main
import "fmt"
func adder() func(int) int {
var x int
fmt.Println("x1:", x)
return func(y int) int {
fmt.Println("y:", y)
fmt.Println("x2:", x)
x += y
fmt.Println("x3:", x)
return x
}
}
func main() {
var f = adder()
fmt.Println(f(10)) //10
fmt.Println(f(20)) //30
fmt.Println(f(30)) //60
}
输出:
x1: 0
y: 10
x2: 0
x3: 10
10
y: 20
x2: 10
x3: 30
30
y: 30
x2: 30
x3: 60
60
(后面再学,两层,x可输出、x值又保存在外层环境中,下次继续用)
三个内置数据结构
创建切片、哈希表和 Channel 等内置的数据结构(后面再学)