pprof have not finished yet, and flag is finish
parent
641b73c56c
commit
ed2d2c6466
|
@ -0,0 +1,22 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// flag获取命令行参数
|
||||||
|
func main() {
|
||||||
|
//创建一个标志位参数
|
||||||
|
name := flag.String("name", "wangao", "define name")
|
||||||
|
age := flag.Int("age", 9000, "define age")
|
||||||
|
married := flag.Bool("married", false, "define married")
|
||||||
|
mTime := flag.Duration("mtime", time.Second, "define mTime") //命令行接受的参数需要带单位,例如1000h:main.exe -mtime 1000h
|
||||||
|
//使用flag
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println(*name, *age, *married, mTime)
|
||||||
|
fmt.Println(flag.Args()) //返回命令行参数后的其他参数,以[]string类型返回
|
||||||
|
fmt.Println(flag.NArg()) // 返回命令行的其他参数个数
|
||||||
|
fmt.Println(flag.NFlag()) //返回使用的命令行参数个数
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var name string
|
||||||
|
flag.StringVar(&name, "name", "wangao", "define name")
|
||||||
|
flag.Parse()
|
||||||
|
fmt.Println(name)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// os.Args 获取命令行参数
|
||||||
|
func main() {
|
||||||
|
fmt.Printf("%#v", os.Args) //获取当前的执行文件和参数
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"course/networkProgram/protocol"
|
"course/networkProgram/protocol"
|
||||||
)
|
)
|
||||||
|
|
||||||
// socket_stick/client/main.go
|
// socket_stick/client/os.args.go
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
conn, err := net.Dial("tcp", "127.0.0.1:30000")
|
conn, err := net.Dial("tcp", "127.0.0.1:30000")
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
// socket_stick/server/main.go
|
// socket_stick/server/os.args.go
|
||||||
func proc(conn net.Conn) {
|
func proc(conn net.Conn) {
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
reader := bufio.NewReader(conn)
|
reader := bufio.NewReader(conn)
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
// runtime_pprof/os.args.go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"runtime/pprof"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 一段有问题的代码
|
||||||
|
func logicCode() {
|
||||||
|
var c chan int //nil 未初始化
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case v := <-c: //阻塞
|
||||||
|
fmt.Printf("recv from chan, value:%v\n", v)
|
||||||
|
default:
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var isCPUPprof bool
|
||||||
|
var isMemPprof bool
|
||||||
|
|
||||||
|
flag.BoolVar(&isCPUPprof, "cpu", false, "turn cpu pprof on")
|
||||||
|
flag.BoolVar(&isMemPprof, "mem", false, "turn mem pprof on")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
if isCPUPprof {
|
||||||
|
file, err := os.Create("./cpu.pprof")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("create cpu pprof failed, err:%v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pprof.StartCPUProfile(file)
|
||||||
|
defer pprof.StopCPUProfile()
|
||||||
|
}
|
||||||
|
for i := 0; i < 8; i++ {
|
||||||
|
go logicCode()
|
||||||
|
}
|
||||||
|
time.Sleep(20 * time.Second)
|
||||||
|
if isMemPprof {
|
||||||
|
file, err := os.Create("./mem.pprof")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Printf("create mem pprof failed, err:%v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
pprof.WriteHeapProfile(file)
|
||||||
|
file.Close()
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
package Splitstring
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
//测试组
|
||||||
|
|
||||||
|
func TestGroupSplit(t *testing.T) {
|
||||||
|
type testCase struct {
|
||||||
|
str string
|
||||||
|
sep string
|
||||||
|
want []string
|
||||||
|
}
|
||||||
|
testGroup := []testCase{
|
||||||
|
{str: "babcbef", sep: "b", want: []string{"", "a", "c", "ef"}},
|
||||||
|
{str: "a:b:c", sep: ":", want: []string{"a", "b", "c"}},
|
||||||
|
{str: "abcef", sep: "bc", want: []string{"a", "ef"}},
|
||||||
|
{str: "沙河有沙又有河", sep: "有", want: []string{"沙河", "沙又", "河"}},
|
||||||
|
}
|
||||||
|
for i, testcase := range testGroup {
|
||||||
|
if !reflect.DeepEqual(Split(testcase.str, testcase.sep), testcase.want) {
|
||||||
|
t.Errorf("testcase %d failed,want: %v got: %v", i+1, testcase.want, Split(testcase.str, testcase.sep))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
package Splitstring
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
//子测试
|
||||||
|
|
||||||
|
func TestGroupChildSplit(t *testing.T) {
|
||||||
|
type testCase struct {
|
||||||
|
str string
|
||||||
|
sep string
|
||||||
|
want []string
|
||||||
|
}
|
||||||
|
testGroup := map[string]testCase{
|
||||||
|
"case1": {str: "babcbef", sep: "b", want: []string{"", "a", "c", "ef"}},
|
||||||
|
"case2": {str: "a:b:c", sep: ":", want: []string{"a", "b", "c"}},
|
||||||
|
"case3": {str: "abcef", sep: "bc", want: []string{"a", "ef"}},
|
||||||
|
"case4": {str: "沙河有沙又有河", sep: "有", want: []string{"沙河", "沙又", "河"}},
|
||||||
|
}
|
||||||
|
for name, testcase := range testGroup {
|
||||||
|
t.Run(name, func(t *testing.T) {
|
||||||
|
got := Split(testcase.str, testcase.sep)
|
||||||
|
if !reflect.DeepEqual(got, testcase.want) {
|
||||||
|
t.Errorf("got:%v, want:%v", got, testcase.want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
package Splitstring
|
package Splitstring
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
//切割字符串
|
//切割字符串
|
||||||
//example
|
//example
|
||||||
|
@ -21,11 +23,11 @@ import "strings"
|
||||||
// abc,b =>[a,c]
|
// abc,b =>[a,c]
|
||||||
|
|
||||||
func Split(str string, sep string) []string {
|
func Split(str string, sep string) []string {
|
||||||
ret := make([]string, 0)
|
var ret = make([]string, 0, strings.Count(str, sep)+1)
|
||||||
index := strings.Index(str, sep)
|
index := strings.Index(str, sep)
|
||||||
for index >= 0 {
|
for index >= 0 {
|
||||||
ret = append(ret, str[:index])
|
ret = append(ret, str[:index])
|
||||||
str = str[index+1:]
|
str = str[index+len(sep):]
|
||||||
index = strings.Index(str, sep)
|
index = strings.Index(str, sep)
|
||||||
}
|
}
|
||||||
ret = append(ret, str)
|
ret = append(ret, str)
|
||||||
|
|
|
@ -22,3 +22,19 @@ func TestSplit2(t *testing.T) {
|
||||||
t.Errorf("want:%v, but got:%v\n", want, got)
|
t.Errorf("want:%v, but got:%v\n", want, got)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSplit3(t *testing.T) {
|
||||||
|
got := Split("abcef", "bc")
|
||||||
|
want := []string{"a", "ef"}
|
||||||
|
if !reflect.DeepEqual(want, got) {
|
||||||
|
t.Fatalf("want:%v, but got:%v\n", want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//基准测试
|
||||||
|
|
||||||
|
func BenchmarkSplit(b *testing.B) {
|
||||||
|
for i := 0; i < b.N; i++ {
|
||||||
|
Split("a:b:c:d:e:f", ":")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue