Browse Source

备份

v1
AICells 5 years ago
parent
commit
45ee74a478
24 changed files with 291 additions and 72 deletions
  1. +4
    -0
      src/docs/go打印堆栈.md
  2. +18
    -1
      src/docs/go语言函数.md
  3. +3
    -0
      src/go.mod
  4. +3
    -3
      src/learn/addrOp.go
  5. +1
    -1
      src/learn/ariOp.go
  6. +5
    -2
      src/learn/array.go
  7. +0
    -2
      src/learn/charCount.go
  8. +33
    -0
      src/learn/const.go
  9. +1
    -1
      src/learn/constVar.go
  10. +8
    -6
      src/learn/fetch.go
  11. +12
    -11
      src/learn/fetch2.go
  12. +39
    -0
      src/learn/func.go
  13. +2
    -2
      src/learn/geometry/geometry/geometry.go
  14. +2
    -1
      src/learn/hello.go
  15. +2
    -3
      src/learn/interface/io/io.go
  16. +25
    -0
      src/learn/menth.go
  17. +7
    -7
      src/learn/mulVar.go
  18. +37
    -0
      src/learn/osSignal.go
  19. +9
    -0
      src/learn/osfuns.go
  20. +41
    -0
      src/learn/share.go
  21. +15
    -5
      src/learn/slice.go
  22. +9
    -13
      src/learn/struct.go
  23. +12
    -13
      src/learn/structs.go
  24. +3
    -1
      src/learn/var.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,延迟调用则会花费更大代价, 其中包括注册 调用等操作还有额外的缓存
因此对于性能要求较高的场合 因避免使用延迟函数

+ 3
- 0
src/go.mod View File

@ -0,0 +1,3 @@
module goUtils
go 1.12

+ 3
- 3
src/learn/addrOp.go View File

@ -2,7 +2,7 @@ package main
import "fmt"
func main(){
func main() {
var a int = 4
var b int32
var c float32
@ -13,7 +13,7 @@ func main(){
fmt.Printf("第三行 -c 变量类型为 %T\n", c)
ptr = &a
fmt.Printf("a的值为 %d \n",a)
fmt.Printf("a的值为 %d \n", a)
fmt.Printf("ptr为 %d\n", *ptr)
fmt.Printf("ptr %d\n", ptr)
}
}

+ 1
- 1
src/learn/ariOp.go View File

@ -12,7 +12,7 @@ func main() {
fmt.Printf("第 2222 c 的值 %d \n", c)
c = a * b
fmt.Printf("第 3333 c 的值 %d \n", c)
c = a*1.0 / b
c = a * 1.0 / b
fmt.Printf("第 4444 c 的值 %d \n", c)
c = a % b
fmt.Printf("第 5555 c 的值 %d \n", c)

+ 5
- 2
src/learn/array.go View File

@ -11,9 +11,12 @@ func main() {
}
//var tet , bb int = 1, 2
var (tet int; bb string)
var (
tet int;
bb string
)
print(tet, bb)
months := [...]string{1:"January", 12:"December"}
months := [...]string{1: "January", 12: "December"}
Q2 := months[4:7]
fmt.Println("%T %T", months, Q2)

+ 0
- 2
src/learn/charCount.go View File

@ -12,7 +12,6 @@ import (
var g = make(map[string]map[string]map[string]bool)
var s = []uint{1}
func main() {
counts := make(map[rune]int)
var utflen [utf8.UTFMax + 1]int
@ -55,5 +54,4 @@ func main() {
}
}

+ 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)
}

+ 1
- 1
src/learn/constVar.go View File

@ -5,7 +5,7 @@ import (
"unsafe"
)
const(
const (
a1 = "abc"
b1 = len(a1)
c1 = unsafe.Sizeof(a1)

+ 8
- 6
src/learn/fetch.go View File

@ -1,23 +1,25 @@
package main
import(
import (
"fmt"
"io/ioutil"
"net/http"
"os"
)
func main(){
for _, url := range os.Args[1:]{
func main() {
for _, url := range os.Args[1:] {
resp, err := http.Get(url)
if err != nil{
if err != nil {
fmt.Fprintf(os.Stderr, "fetch:%v\n", err)
os.Exit(1)
}
b, err := ioutil.ReadAll(resp.Body)
resp.Body.Close()
if err != nil{
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
os.Exit(1)
}
fmt.Printf("IMY****\n %s\n", b)
}
}
}

+ 12
- 11
src/learn/fetch2.go View File

@ -1,5 +1,6 @@
package main
import(
import (
"fmt"
"io"
"io/ioutil"
@ -8,29 +9,29 @@ import(
"time"
)
func main() {
func main() {
start := time.Now()
ch := make(chan string)
for _, url := range os.Args[1:]{
go fetch(url, ch) // 启动一个goroutine
for _, url := range os.Args[1:] {
go fetch(url, ch) // 启动一个goroutine
}
for range os.Args[1:]{
fmt.Println(<- ch)
for range os.Args[1:] {
fmt.Println(<-ch)
}
fmt.Printf("IMY*****main* %2fs elapsed\n", time.Since(start).Seconds())
}
func fetch(url string, ch chan <- string){
func fetch(url string, ch chan<- string) {
start := time.Now()
resp, err := http.Get(url)
if err != nil{
if err != nil {
ch <- fmt.Sprint(err) // 发送到通道ch
return
}
nbytes, err := io.Copy(ioutil.Discard, resp.Body)
resp.Body.Close() //不要泄露资源
if err != nil{
resp.Body.Close() //不要泄露资源
if err != nil {
ch <- fmt.Sprintf("while reading %s %v", url, err)
return
@ -38,4 +39,4 @@ func fetch(url string, ch chan <- string){
secs := time.Since(start).Seconds()
ch <- fmt.Sprintf("IMY***fetch* %.2fs, %7d %s ", secs, nbytes, url)
}
}

+ 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))
}

+ 2
- 2
src/learn/geometry/geometry/geometry.go View File

@ -2,7 +2,7 @@ package geometry
import "math"
type Point struct {X, Y float64}
type Point struct{ X, Y float64 }
// 普通函数
func Distance(p, q Point) float64 {
@ -32,4 +32,4 @@ func (path Path) Distance() float64 {
func (p *Point) ScaleBy(factor float64) {
p.X *= factor
p.Y *= factor
}
}

+ 2
- 1
src/learn/hello.go View File

@ -1,6 +1,7 @@
package learn
import "fmt"
func main(){
func main() {
fmt.Println("hello world!")
}

+ 2
- 3
src/learn/interface/io/io.go View File

@ -1,4 +1,5 @@
package io
type Reader interface {
Read(p []byte) (n int, err error)
}
@ -11,7 +12,7 @@ type Closer interface {
Close() error
}
type ReadWriter interface{
type ReadWriter interface {
Reader
Writer
}
@ -28,5 +29,3 @@ type ReadWriteCloser2 interface {
Writer
Close() error
}

+ 25
- 0
src/learn/menth.go View File

@ -0,0 +1,25 @@
package main
import "fmt"
type N int
func (n N) value() {
n++
fmt.Println("v: %p %v \n ", &n, n)
}
func (n *N) pointer() {
(*n)++
fmt.Println("v: %p %v \n ", n, *n)
}
func main() {
var a N = 25
p := &a
p2 := &p
(*p2).value()
(*p2).pointer()
}

+ 7
- 7
src/learn/mulVar.go View File

@ -1,9 +1,9 @@
package main
var x, y int
var ( // 这种因式分解关键字的写法一般用于声明全局变量
a int
b bool
var ( // 这种因式分解关键字的写法一般用于声明全局变量
a int
b bool
)
var c, d int = 1, 2
@ -12,7 +12,7 @@ var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
func main(){
g, h := 123, "hello"
println(x, y, a, b, c, d, e, f, g, h)
}
func main() {
g, h := 123, "hello"
println(x, y, a, b, c, d, e, f, g, h)
}

+ 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)
}

+ 15
- 5
src/learn/slice.go View File

@ -34,17 +34,27 @@ func remove(slice []int, i int) []int {
return slice[:len(slice)-1]
}
func remove2(slice []int, i int) []int{
slice[i] = slice[len(slice) - 1]
return slice[:len(slice) - 1]
func remove2(slice []int, i int) []int {
slice[i] = slice[len(slice)-1]
return slice[:len(slice)-1]
}
func main(){
func main() {
s := []int{5, 6, 7, 8, 9}
fmt.Println(s[:len(s)])
fmt.Println(remove2(s, 2))
}
m := map[string][2]int{
"a": {1, 2},
"b": {3, 4},
}
s1 := m["a"]
s2 := s1[:]
fmt.Printf("sssss %v %v \n", s1, s2)
ssss := [][][][][][]int{}
fmt.Printf("%T \n", ssss)
}

+ 9
- 13
src/learn/struct.go View File

@ -1,24 +1,22 @@
package main
import (
"fmt"
"time"
)
type Emplyee struct{
Id int
Name string
Address string
Dob time.Time
Position string
Salary int
type Emplyee struct {
Id int
Name string
Address string
Dob time.Time
Position string
Salary int
ManagerId int
}
var dilbert Emplyee
func test(){
func test() {
dilbert.Salary -= 5000
posPtr := &dilbert.Position
*posPtr = "fdfdsfdfd" + *posPtr
@ -32,11 +30,9 @@ func test(){
//没有任何成员变量的结构体成为空结构体
set := make(map[string]struct{})
if _, ok := set[str]; !ok{
if _, ok := set[str]; !ok {
set[str] = struct{}{}
}
}

+ 12
- 13
src/learn/structs.go View File

@ -2,14 +2,14 @@ package main
import "fmt"
type Books struct{
title string
author string
type Books struct {
title string
author string
subject string
book_id int
}
func main(){
func main() {
var Book1 Books
var Book2 Books
@ -24,16 +24,15 @@ func main(){
Book2.book_id = 464513
/* 打印 Book1 信息 */
fmt.Printf( "Book 1 title : %s\n", Book1.title)
fmt.Printf( "Book 1 author : %s\n", Book1.author)
fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)
fmt.Printf("Book 1 title : %s\n", Book1.title)
fmt.Printf("Book 1 author : %s\n", Book1.author)
fmt.Printf("Book 1 subject : %s\n", Book1.subject)
fmt.Printf("Book 1 book_id : %d\n", Book1.book_id)
/* 打印 Book2 信息 */
fmt.Printf( "Book 2 title : %s\n", Book2.title)
fmt.Printf( "Book 2 author : %s\n", Book2.author)
fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
fmt.Printf("Book 2 title : %s\n", Book2.title)
fmt.Printf("Book 2 author : %s\n", Book2.author)
fmt.Printf("Book 2 subject : %s\n", Book2.subject)
fmt.Printf("Book 2 book_id : %d\n", Book2.book_id)
}

+ 3
- 1
src/learn/var.go View File

@ -1,5 +1,7 @@
package main
import "fmt"
func main() {
// 声明一个变量并初始化
@ -22,7 +24,7 @@ func main() {
var a1 *int
var a2 []int
var a3 map[string] int
var a3 map[string]int
var a4 chan int
var a5 func(string) int
var a6 error // error 是接口

Loading…
Cancel
Save