import引用的是当前gopath目录下的源码文件,gopath可以设置多个 flag StringVar String Parse go run xx.go --help #查看参数说明 godoc 同一目录,无子目录的源码文件需要被声明为同一代码包package internal 模块私有化 包冲突:设置别名、点操作、匿名方式 04 变量的重声明 类型断言 X.(T) interface{}(_)([]String) 空接口 类型字面量 切片的类型字面量中只有元素的类型,而没有长度 Go 语言的切片类型属于引用类型,同属引用类型的还有字典类型、通道类型、函数类型等;而 Go 语言的数组类型则属于值类型,同属值类型的有基础数据类型以及结构体类型。 如下图 08container中包含的那些容器 Go 语言字典的键类型不可以是函数类型、字典类型和切片类型。 并发安全的问题原因? * 多个Goroutine读写同一片内存; 并发安全的实现方式? * 加锁 * sync/atmoic 包 * sync.Mutex、sync.RWMutex * Channel本身支持内存序列,一次只处理一个数据,避免了data race make支持的数据类型? slice、map、chan go mod使用,需要先设置为on,初始化go mod init 项目名,在go run时会自动下载依赖,go build ./…, go get [@v],go mod tidy go install结果会到gopath里,go get命令会安装在gopath下的src里面(在开启module时,不在$GOPATH\src\,而是去了 $GOPATH\src\pkg) defer 栈,先进后出,函数结束时发生(在return,panic前执行),参数在defer语句时计算
package main
import "fmt"
func tryDefer ( ) {
defer fmt. Println ( 1 )
defer fmt. Println ( 2 )
fmt. Println ( 3 )
panic ( "error" )
return
fmt. Println ( 4 )
}
func main ( ) {
tryDefer ( )
}
运行结果
3
2
1
panic : error
goroutine 1 [ running] :
main. tryDefer ( )
D: / go - work/ src/ go - admin/ t0104/ main. go : 9 + 0x165
main. main ( )
D: / go - work/ src/ go - admin/ t0104/ main. go : 45 + 0x4ce
// 向标准输出写入内容 fmt.Fprintln(os.Stdout, “向标准输出写入内容”) bufio.NewWriter() xxx.Flush test 代码覆盖率 性能测试 goroutine注意不要在主函数执行完之后执行 非抢占式,如果不交出控制权,会卡死,runtime.Gosched()//交出控制权,io操作,select,channel,等待锁会切换控制权 -race检测数据访问冲突 chan close 检测是否发送完成 sync,waitGroup add done wait 函数的参数、变量、返回值都可以是函数 闭包
import "fmt"
func adder ( ) func ( int ) int {
sum := 0
return func ( i int ) int {
sum += i
return sum
}
}
func main ( ) {
a := adder ( )
for i := 0 ; i < 10 ; i++ {
fmt. Printf ( "0 + 1 + ... + %d = %d\n" , i, a ( i) )
}
}
运行结果
0 + 1 + ... + 0 = 0
0 + 1 + ... + 1 = 1
0 + 1 + ... + 2 = 3
0 + 1 + ... + 3 = 6
0 + 1 + ... + 4 = 10
0 + 1 + ... + 5 = 15
0 + 1 + ... + 6 = 21
0 + 1 + ... + 7 = 28
0 + 1 + ... + 8 = 36
0 + 1 + ... + 9 = 45
斐波那契数列
import "fmt"
func fibonacci ( ) func ( ) int {
a, b := 0 , 1
return func ( ) int {
a, b = b, a+ b
return a
}
}
func main ( ) {
f := fibonacci ( )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
fmt. Println ( f ( ) )
}