2019年3月16日
一、 Go 编译快 依赖关系判断 第一点,所有导入的包必须在每个文件的开头显式声明,这样的话编译器就没有必要读取和分析整个源文件来判断包的依赖关系。
禁止环状依赖 第二点,禁止包的环状依赖,因为没有循环依赖,包的依赖关系形成一个有向无环图,每个包可以被独立编译,而且很可能是被并发编译。
记录依赖关系 第三点,编译后包的目标文件不仅仅记录包本身的导出信息,目标文件同时还记录了包的依赖关系。
二、 导入路径 import 语句是导入的包路径,不是包名。 三、 包声明 每个 Go 语言源文件的开头都必须有包声明语句(即指明包名)
通常情况下,默认的包名就是包导入路径名的最后一段。
例外情况:
main包的路径无关紧要 以 _test 结束的包名,即测试包,可与其它包在同一路径下共存 包含版本号的导入路径, 如 “gopkg.in/yaml.v2”。这种情况下包的名字并不包含版本号后缀,而是yaml。 四、 导入声明 有两种形式 // 形式一 import "fmt" import "os" //形式二 import ( "fmt" "os" ) 通常将来自不同组织的包用空行分组 import ( "fmt" "html/template" "os" "golang.org/x/net/html" "golang.org/x/net/ipv4" ) 导入包重命名 import ( "crypto/rand" mrand "math/rand" // alternative name mrand avoids conflict ) 五、 包的匿名导入 导入包不使用包,会导致编译错误……
阅读全文
2019年3月15日
#!/bin/bash shmid=$(ipcs -m | grep -vE '(Shared | shmid)' | awk '{print $2}') for id in $shmid; do ipcrm -m $id done ……
阅读全文
2019年3月15日
一、 竞争条件 多个 goroutine 并发访问同一变量时,如果存在对该变量的写操作。就会发生竞争。 go 的口头禅:不要使用共享数据来通信;使用通信来共享数据。
避免竞争方法 方法一、不要去写共享变量 方法二、避免从多个goroutine访问变量 方法三、使用互斥锁
二、 sync.Mutex互斥锁 二元信号量 一个只能为0和1信号量叫做二元信号量
var ( sema = make(chan struct{}, 1) // a binary semaphore guarding balance balance int ) func Deposit(amount int) { sema <- struct{}{} // acquire token balance = balance + amount <-sema // release token } func Balance() int { sema <- struct{}{} // acquire token b := balance <-sema // release token return b } sync 包中的 Mutex 类似二元信号量 import "sync" var ( mu sync.……
阅读全文
2019年3月13日
简述 基本类型是Go语言世界的原子,复合类型则是分子。
数组 数组是固定长度的序列。因此,其很少直接使用。 与C语言数组特性类似。
var a [3]int //其中[3]int为数组类型 fmt.Println(a[0]) fmt.Println(a[len(a) - 1]) var b [3]int = [3]int{1, 2, 3} var c [3]int = [3]int{1, 2} var d = [...]int{1, 2, 3, 4} // len = 4 q := [...]int{1, 2} //指定一个索引和对应值列表的方式初始化 type Currency int const ( USD Currency = iota // 美元 EUR // 欧元 GBP // 英镑 RMB // 人民币 ) symbol := [...]string{USD: "$", EUR: "€", GBP: "£", RMB: "¥"} fmt.……
阅读全文
2019年3月12日
整型 一般整型
int8 int16 int32 int64
uint8 uint16 uint32 uint64
分别对应8、16、32、64bit的数 特别的整型 Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。因此rune和int32可以互换使用。
byte类型等价于uint8类型,byte用于强调数据的原始性。
uintptr用来存放指针,多用于底层编程。
int和int32大小相同,但是,是两个不同的类型。
取模的结果总是与被取模数的符号相同
fmt.Println(5%3) //2 fmt.Println(5%-3) //2 fmt.Println(-5%3) //-2 fmt.Println(-5%-3) //-2 符点数 float32、float64
通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散。
复数 complex64、complex128
var x complex128 = complex(1, 2) // 1+2i var y complex128 = complex(3, 4) // 3+4i fmt.Println(x*y) // "(-5+10i)" fmt.Println(real(x*y)) // "-5" //取实部 fmt.Println(imag(x*y)) // "10" //取虚部 布尔型 true/false
// btoi returns 1 if b is true and 0 if false.……
阅读全文