Browse Source

学习笔记备份提交

v1
SisMaker 5 years ago
parent
commit
a74b11dbdc
7 changed files with 181 additions and 1 deletions
  1. +4
    -0
      src/docs/go打印堆栈.md
  2. +18
    -1
      src/docs/go语言函数.md
  3. +33
    -0
      src/learn/const.go
  4. +39
    -0
      src/learn/func.go
  5. +37
    -0
      src/learn/osSignal.go
  6. +9
    -0
      src/learn/osfuns.go
  7. +41
    -0
      src/learn/share.go

+ 4
- 0
src/docs/go打印堆栈.md View File

@ -0,0 +1,4 @@
# 打印堆栈
fmt.Printf("%s", debug.Stack())
debug.PrintStack()
可以通过 debug.PrintStack() 直接打印,也可以通过 debug.Stack() 方法获取堆栈然后自己打印。

+ 18
- 1
src/docs/go语言函数.md View File

@ -36,4 +36,21 @@
闭包 闭包是匿名函数,可在动态编程中使用
方法 方法就是一个包含了接受者的函数
# 匿名函数
匿名函数是指没有定义名字符号的函数
除没有名字外 匿名函数和普通函数完全相同 最大的区别是 我们可以在匿名函数内定义匿名函数
形成类似嵌套效果。匿名函数可直接调用, 保存到变量, 作为函数参数和返回值
将匿名函数赋值给变量 与普通函数提供的名字标识符有着根本的区别, 编译器会为匿名函数生成一个随机的符号名
普通函数和匿名函数都可以作为结构体或经过通道传递
未使用的匿名函数会被编译器当做错误
# 延迟函数
语句defer 向当前函数注册稍后执行的函数调用, 这些调用成为延迟调用
它们知道当前函数执行结束才被执行 常用语资源释放 接触锁定 以及错误处理等操作
FILO
性能:
相比直接调用call,延迟调用则会花费更大代价, 其中包括注册 调用等操作还有额外的缓存
因此对于性能要求较高的场合 因避免使用延迟函数

+ 33
- 0
src/learn/const.go View File

@ -0,0 +1,33 @@
package main
import (
"fmt"
"math"
)
var XX = 200
const YY = 300 //常量不会分配地址
func main() {
const (
x uint16 = 120
y
s
s1 = "abc"
z
)
println(x, " ", y, " ", s, " ", s1, " ", z)
const (
a = iota
a1
b float32 = iota
c
)
println(a, " ", a1, " ", b, " ", c)
// println(&XX, &YY) // error
fmt.Printf("%v %v \n", math.MaxUint8, math.MaxInt64)
}

+ 39
- 0
src/learn/func.go View File

@ -0,0 +1,39 @@
package main
func tets() (a int, s string, e error) {
return 0, "", nil
}
func test(f func()) {
f()
}
func makeFun() func(int, int) int {
return func(x, y int) int {
return x - y
}
}
func main() {
tets()
// 直接调用匿名函数
func(s string) {
println("the string is ", s)
}("hello world")
// 将匿名函数复制给变量
add := func(x, y int) int {
return x + y
}
println("the add ret is ", add(1, 2))
// 作为参数
test(func() { println("this is one func") })
// 作为返回值
sub := makeFun()
println("the sub fun retrun is ", sub(10, 1))
}

+ 37
- 0
src/learn/osSignal.go View File

@ -0,0 +1,37 @@
package main
import (
"os"
"os/signal"
"syscall"
)
func main() {
ch := make(chan os.Signal, 1)
//signal.Notify(ch, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGSTOP, syscall.SIGUSR1)
signal.Notify(ch)
for {
sig := <-ch
switch sig {
case syscall.SIGHUP:
println("SIGSTOP")
return
case syscall.SIGQUIT:
println("SIGQUIT")
return
case syscall.SIGTERM:
println("SIGTERM")
return
case syscall.SIGSTOP:
println("SIGSTOP")
return
case syscall.SIGUSR1:
println("SIGUSR1")
return
default:
println("what is this ", sig)
return
}
}
}

+ 9
- 0
src/learn/osfuns.go View File

@ -0,0 +1,9 @@
package main
import "os"
func main() {
hostname, err := os.Hostname()
println(hostname, " ", err)
}

+ 41
- 0
src/learn/share.go View File

@ -0,0 +1,41 @@
package main
import (
"os"
"strconv"
"time"
)
var share int = 0
var Cnt int
func GSet(index int, ch chan struct{}) {
for i := 0; i < Cnt; i++ {
//println("cur index ", index, "cur vale", share)
share += 1
ch <- struct{}{}
}
}
func main() {
Num, _ := strconv.Atoi(os.Args[1])
Cnt, _ = strconv.Atoi(os.Args[2])
println(Num, Cnt)
ch := make(chan struct{})
start := time.Now()
for i := 0; i < Num; i++ {
go GSet(i, ch)
}
GetNum := 0
for {
<-ch
GetNum++
//println("add one num ", GetNum)
if GetNum >= Cnt*Num {
break
}
}
use := time.Since(start)
println("test over ", share, "should be ", Cnt*Num, "use time ", use)
}

Loading…
Cancel
Save