diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..330b150 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // 使用 IntelliSense 了解相关属性。 + // 悬停以查看现有属性的描述。 + // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [{ + "name": "Launch", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${fileDirname}/../main.go", + "env": {}, + "args": [] + }] +} \ No newline at end of file diff --git a/__debug_bin b/__debug_bin new file mode 100644 index 0000000..f4d9281 Binary files /dev/null and b/__debug_bin differ diff --git a/db/index.go b/db/index.go new file mode 100644 index 0000000..2845499 --- /dev/null +++ b/db/index.go @@ -0,0 +1,93 @@ +package db + +import ( + _"github.com/go-sql-driver/mysql" + "database/sql" + "fmt" + "strings" +) +// 教程 +// https://www.jianshu.com/p/ee87e989f149 +//数据库配置 +const ( + userName = "go_test" + password = "R4MSD57Gmr42CRTw" + ip = "27.102.70.190" + port = "3306" + dbName = "go_test" +) +//Db数据库连接池 +var DB *sql.DB + +//注意方法名大写,就是public +func InitDB() bool { + //构建连接:"用户名:密码@tcp(IP:端口)/数据库?charset=utf8" + path := strings.Join([]string{userName, ":", password, "@tcp(",ip, ":", port, ")/", dbName, "?charset=utf8"}, "") + + //打开数据库,前者是驱动名,所以要导入: _ "github.com/go-sql-driver/mysql" + DB, _ = sql.Open("mysql", path) + //设置数据库最大连接数 + DB.SetConnMaxLifetime(100) + //设置上数据库最大闲置连接数 + DB.SetMaxIdleConns(10) + //验证连接 + if err := DB.Ping(); err != nil{ + fmt.Println("opon database fail",err) + return false + } + fmt.Println("connnect success") + return true +} + +type User struct { + Id int + UserName string + Password string +} + +func InsertUser(user User) (bool){ + //开启事务 + tx, err := DB.Begin() + if err != nil{ + fmt.Println("tx fail") + return false + } + //准备sql语句 + stmt, err := tx.Prepare("INSERT INTO nk_user (`name`, `password`) VALUES (?, ?)") + if err != nil{ + fmt.Println("Prepare fail") + return false + } + //将参数传递到sql语句中并且执行 + res, err := stmt.Exec(user.UserName, user.Password) + if err != nil{ + fmt.Println("Exec fail") + return false + } + //将事务提交 + tx.Commit() + //获得上一个插入自增的id + fmt.Println(res.LastInsertId()) + return true +} + +func SelectAllUser() ([]User) { + //执行查询语句 + rows, err := DB.Query("SELECT * from nk_user") + if err != nil{ + fmt.Println("查询出错了") + } + var users []User + //循环读取结果 + for rows.Next(){ + var user User + //将每一行的结果都赋值到一个user对象中 + err := rows.Scan(&user.Id, &user.UserName, &user.Password) + if err != nil { + fmt.Println("rows fail") + } + //将user追加到users的这个数组中 + users = append(users, user) + } + return users +} \ No newline at end of file diff --git a/demo/fuck.go b/demo/fuck.go new file mode 100644 index 0000000..64c3258 --- /dev/null +++ b/demo/fuck.go @@ -0,0 +1,80 @@ +// 包名 +package main + +import ( + "fmt" + "io/ioutil" + "encoding/json" + "./path" + "./runtime" + "time" + "./pk10" + "./db" +) + +func readJSON(file string) []map[string][]interface{} { + log := fmt.Println + jsondata, _ := ioutil.ReadFile(file) + var user []map[string][]interface{} + err := json.Unmarshal(jsondata, &user) + if err != nil { + log(err) + return nil + } + return user +} +// https://studygolang.com/pkgdoc +func main() { + log := fmt.Println + pk10.Log() + var isConnect bool= db.InitDB() + if isConnect { + // define a user data + var user db.User + user.UserName="dsad" + user.Password="123" + // insert user data + runtime.Time("插入一个User数据",func () { + db.InsertUser(user) + }) + log("fuck") + var allUsers []db.User + runtime.Time("查询所有用户",func () { + allUsers = db.SelectAllUser() + }) + // 这么取出结构体的值 + log(allUsers[0].Id) + return + }else { + log("数据库未连接,其实不用这么判断,但是任性") + return + } + + //we are test now + // pk10.Init() + var allArray []map[string][]interface{} + runtime.Time("加载JSON数据",func () { + var parhArray = path.Output(".\\data") + for _, filePath := range parhArray { + str := path.Abs("./"+filePath) + log("正在读取:",str) + oneData := readJSON(str) + if oneData != nil { + for _, item := range oneData { + allArray = append(allArray,item) + } + } + } + log("长度: ", len(allArray)) + runtime.Time("遍历所有的数据",func () { + sum := 0 + for _, item := range allArray { + if item!=nil { + sum++ + } + time.Sleep(2) + } + log("长度: ", sum) + }) + }) +} diff --git a/demo/loadjson.go b/demo/loadjson.go new file mode 100644 index 0000000..3ba5206 --- /dev/null +++ b/demo/loadjson.go @@ -0,0 +1,49 @@ +package main +import ( + "fmt" + "io/ioutil" + "encoding/json" + "../path" + "time" +) + +func readJSON(file string) []map[string][]interface{} { + log := fmt.Println + jsondata, _ := ioutil.ReadFile(file) + var user []map[string][]interface{} + err := json.Unmarshal(jsondata, &user) + if err != nil { + log(err) + return nil + } + return user +} +func main() { + t1 := time.Now() + var allArray []map[string][]interface{} + var parhArray = path.Output(".\\data") + for _, filePath := range parhArray { + str := path.Abs("./"+filePath) + fmt.Println("正在读取:",str) + oneData := readJSON(str) + if oneData != nil { + for _, item := range oneData { + allArray = append(allArray,item) + } + } + } + runAllt := time.Now() + sum := 0 + for _, item := range allArray { + if item!=nil { + sum++ + } + } + fmt.Println("长度: ", sum) + runAll := time.Since(runAllt) + fmt.Println("该程序运行的时长: ", runAll) + + fmt.Println(allArray[0]) + elapsed := time.Since(t1) + fmt.Println("该程序运行的时长: ", elapsed) +} \ No newline at end of file diff --git a/demo/readme b/demo/readme new file mode 100644 index 0000000..7166679 --- /dev/null +++ b/demo/readme @@ -0,0 +1 @@ +用作demo程序展示,不做任何用途 \ No newline at end of file diff --git a/go-demo.exe b/go-demo.exe new file mode 100644 index 0000000..e68439c Binary files /dev/null and b/go-demo.exe differ diff --git a/main.go b/main.go index b8a19f8..12335d0 100644 --- a/main.go +++ b/main.go @@ -3,27 +3,204 @@ package main import ( "fmt" - "./sm" "io/ioutil" "encoding/json" "./path" - fuck "./sm/fuck" + "./runtime" + "strconv" + // "time" + // "./pk10" + // "./db" ) -func main() { - fmt.Println(fuck.Add(1,2)) - fmt.Println(sm.Addd(1,2)) - fmt.Println("Hello, World!") - // 要使用这个方法的话需要一起编译,先用go build . - // test() - var parhArray = path.Output("./data") - fmt.Println(parhArray[0]) - str := "./"+parhArray[0] - jsondata, _ := ioutil.ReadFile(str) - var user []map[string][]int +func readJSON(file string) []map[string][]interface{} { + log := fmt.Println + jsondata, _ := ioutil.ReadFile(file) + var user []map[string][]interface{} err := json.Unmarshal(jsondata, &user) if err != nil { - fmt.Println(err) + log(err) + return nil + } + return user +} +// 万能类型转数字。只能先转float64,然后转int +func w2int(array []interface{}) []int{ + var res []int + for _, val := range array { + var temp float64= val.(float64) + res=append(res,int(temp)) } - fmt.Println(user[2]["one"]) + return res +} + +// https://studygolang.com/pkgdoc +func main() { + log := fmt.Println + log(str2arr("asdasd")) + open() + return + + var allArray []map[string][]interface{} + runtime.Time("加载JSON数据",func () { + // 遍历文件夹 + var parhArray = path.Output(".\\data") + // 只用一个文价测试 + str := path.Abs("./"+parhArray[10]) + log("正在读取:",str) + oneData := readJSON(str) + if oneData == nil { + log("load failed") + return + } + for _, item := range oneData { + allArray = append(allArray,item) + } + log("长度: ", len(allArray)) + host := 0 + runtime.Time("遍历所有的数据",func () { + for _, item := range allArray { + // var mon int + // 定义存放开奖类型的数组 + var niu_list []int = w2int(item["type"][0:6]) + // 庄家的牛 + var host_niu int = niu_list[host] + // 庄家为牛牛时大于其他的牛 + if host_niu == 0 { + host_niu = 11 + } + // 赢家的字符串 + var win string = "" + for i := 0; i < len(niu_list); i++ { + if i!=host { + if niu_list[i] > host_niu{ + win += strconv.Itoa(i) + } + } + } + log(win) + // 因为item["type"][7]刚取出来时万能类型,先转换成[]interface{},在转[]int + // var alltype = w2int(item["type"][7].([]interface{})) + // log(alltype) + break + } + }) + }) } + +// https://blog.csdn.net/u010412301/article/details/83894740 +func open(host_v int,downmoney_v []int,cs float64, downpei_v []int, winner_v string) { + var downmoney = []int{0,0,0,0,0,0} + var host string= strconv.Itoa(0) + // 定义所有玩家 + var origin []string = []string{"0","1","2","3","4","5"} + // 删除庄家位置 + delOne(origin,host) + var winner string = "123" + var lose string = "" + for _, val := range origin { + var index int = -1 + for i := 0; i < len(winner); i++ { + // 此时winner[i]是byte类型,不能比较,需要转化成字符串 + if (val == string(winner[i])) { + index = i + break + } + } + if index==-1 { + lose += val + } + } + var temp = map[string]string{"w":winner,"l":lose} + fmt.Println(winner) + fmt.Println(lose) + host_str,_ := strconv.Atoi(host) + fmt.Println(getWin(downmoney,host_str,temp,[]int{1,1,1,1,1,1})) +} + +func getWin(down []int,host int,wl map[string]string,pei []int) (int,map[string]string,int,int) { + var sum = 0 + var hostsum = down[host]; + var bate = [6]int{0, 0, 0, 0, 0, 0} + for i, val := range down { + if i!= host { + sum+=val + if sum!=0 { + bate[i] = hostsum / sum; + }else{ + bate[i] = 0 + } + }else{ + bate[i] = -1; + } + } + var win = [6]int{0, 0, 0, 0, 0, 0} + var warr = str2arrInt(wl["w"]) + var cal = 0 + var summoney = 0 + var money = hostsum + for _, val := range warr { + win[val] = down[val] * bate[val] * pei[val] + money += down[val] * bate[val] * pei[val] + cal += down[val] * bate[val] * pei[val] + var intdown = down[val] * bate[val] + if intdown<0 { + summoney -= intdown + }else{ + summoney += intdown + } + } + var larr = str2arrInt(wl["l"]) + for _, val := range larr { + win[val] = -down[val] * bate[val] * 1 * pei[val]; + money -= down[val] * bate[val] * pei[val] + var intdown = down[val] * bate[val] + if intdown<0 { + summoney -= intdown + }else{ + summoney += intdown + } + } + var m = money + win[0] + win[1] + win[2] + win[3] + win[4] + win[5] + var v = wl + return m,v,cal,summoney + // fmt.Println(warr) + // fmt.Println(larr) + // var win = [0, 0, 0, 0, 0, 0] + +} +func str2arrInt(arr string) []int { + var res []int + for _, val := range arr { + valint,_ := strconv.Atoi(string(val)) + res = append(res,valint) + } + return res +} +func str2arr(arr string) []string { + var res []string + for _, val := range arr { + res = append(res,string(val)) + } + return res +} + +func findOne(array []string,value string) int { + var res int = -1 + for i := 0; i < len(array); i++ { + if value == array[i] { + res = i + } + } + return res +} + +func delOne(array []string,value string) []string { + var res []string + for i := 0; i < len(array); i++ { + if value != array[i] { + res = append(res,array[i]) + } + } + return res +} \ No newline at end of file diff --git a/path/path.go b/path/path.go index cda35c9..65392f2 100644 --- a/path/path.go +++ b/path/path.go @@ -24,3 +24,13 @@ func Output(path string,) []string { } return array } +/* + +*/ +func Abs(path string ) string { + var absolutePath,err = filepath.Abs(path) + if err!=nil { + fmt.Printf("err:", err) + } + return absolutePath +} \ No newline at end of file diff --git a/pk10/index.go b/pk10/index.go new file mode 100644 index 0000000..71f261a --- /dev/null +++ b/pk10/index.go @@ -0,0 +1,202 @@ +package pk10 + +import ( + "fmt" +) + +func Log() { + fmt.Println("dsa") +} + +/*作为包被导入时会自动自行的函数*/ +func init() { + keys = [][]int{ + // 第一球: + // 单双 + []int{1,2}, + // 大小 + []int{3,4}, + // 龙虎 + []int{5,6}, + + // 第二球: + // 单双 + []int{7,8}, + // 大小 + []int{9,10}, + // 龙虎 + []int{11,12}, + + // 第三球: + // 单双 + []int{13,14}, + // 大小 + []int{15,16}, + // 龙虎 + []int{17,18}, + + // 第四球: + // 单双 + []int{19,20}, + // 大小 + []int{21,22}, + // 龙虎 + []int{23,24}, + + // 第五球: + // 单双 + []int{25,26}, + // 大小 + []int{27,28}, + // 龙虎 + []int{29,30}, + + // 第六球: + // 单双 + []int{31,32}, + // 大小 + []int{33,34}, + + // 第七球: + // 单双 + []int{35,36}, + // 大小 + []int{37,38}, + + // 第八球: + // 单双 + []int{39,40}, + // 大小 + []int{41,42}, + + // 第九球: + // 单双 + []int{43,44}, + // 大小 + []int{45,46}, + + // 第十球: + // 单双 + []int{47,48}, + // 大小 + []int{49,50}, + + // 冠亚和单双 + []int{51, 52}, + // 冠亚和大小 + []int{53, 54}, + g(55,17), + g(100,10), + g(110,10), + g(120,10), + g(130,10), + g(140,10), + g(150,10), + g(160,10), + g(170,10), + g(180,10), + g(190,10)} + money = [][]int{ + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,17), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10)} + bate = [][]int{ + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + + s(0,2), + s(0,2), + s(0,17), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10), + s(0,10)} + fmt.Println(len(keys)) + fmt.Println(len(money)) + fmt.Println(len(bate)) + + fmt.Println(bate) +} \ No newline at end of file diff --git a/pk10/interface.go b/pk10/interface.go new file mode 100644 index 0000000..ccd0fab --- /dev/null +++ b/pk10/interface.go @@ -0,0 +1,7 @@ +package pk10 + +type User struct { + id int + UserName string + Password string +} diff --git a/pk10/var.go b/pk10/var.go new file mode 100644 index 0000000..2eb34b6 --- /dev/null +++ b/pk10/var.go @@ -0,0 +1,22 @@ +package pk10 + + +var keys [][]int +var money [][]int +var bate [][]int + +func g(start int,hl int) []int { + var val = []int{} + for i := start; i < start+hl; i++ { + val=append(val,i) + } + return val +} + +func s(start int,hl int) []int { + var val = []int{} + for i := start; i < start+hl; i++ { + val=append(val,start) + } + return val +} diff --git a/readme.md b/readme.md index 97199ef..b52a4e4 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,11 @@ -> 目的:快速上手go语言 +> 目的:快速上手 go 语言 1. `package main` 表示我们这个文件的包名 2. `import "fmt"` 表示引入`fmt`包 3. 注释的代码 + ``` // 单行注释 /* @@ -16,6 +17,7 @@ 4. `func main() {}`必须要有的,作为入口函数执行 5. 数据类型: + ``` 1. 布尔型 2. 数字类型 @@ -25,6 +27,7 @@ ``` 5. 定义变量: + ``` var age int;//表示定义一个int型的age变量,如果没有初始化,变量默认为零值。 fruit = apples + oranges;//表示定义一个fruit变量,类型初始化是啥就是啥 @@ -33,11 +36,12 @@ intVal,intVal1 := 1,2//省略 var, 注意 := 左侧如果没有声明新的变 ``` 6. 常量: + ``` //显式类型定义: const b string = "abc" //隐式类型定义: const b = "abc" //const c_name1, c_name2 = value1, value2 -//枚举: +//枚举: const ( Unknown = 0 Female = 1 @@ -45,4 +49,102 @@ const ( ) //iota: iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。 -``` \ No newline at end of file +``` + +7. 任意类型:`interface{}` + +``` +var user = []map[string][]interface{} +//定义了类似这种的结构:[{"ada":[1,"dsa",[12,3,]]}] +``` + +8. 取出结构体的值 + +``` +//如果我们有这样的结构体 +type User struct { + Id int + UserName string + Password string +} + +//当我们解析出数据的时候,可能会得到这样的值 +{1 dsad 123} +//这时候直接用这样的方式取值 +user.Id //1 +``` + +9. 好像没回调也不会执行下面的语句,要等执行完成才会执行下面的语句 + +10) defer 规则 + defer 声名的函数最后才会执行,会先执行函数内其他的 + https://www.cnblogs.com/jukaiit/p/10786093.html + +``` +package main +import "fmt" +func main() { + defer fmt.Println("world") + fmt.Println("hello") +} +//hello +//world +``` + +11. 切片 + https://www.cnblogs.com/OctoptusLian/p/9205326.html + 切片拥有 长度 和 容量。 + 切片的长度就是它所包含的元素个数。 + 切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。 + 切片 s 的长度和容量可通过表达式 len(s) 和 cap(s) 来获取。 + 你可以通过重新切片来扩展一个切片,给它提供足够的容量。 + + ``` + package main + import "fmt" + func main() { + s := []int{2, 3, 5, 7, 11, 13} + printSlice(s) + // 截取切片使其长度为 0 + s = s[:0] + printSlice(s) + // 拓展其长度 + s = s[:4] + printSlice(s) + // 舍弃前两个值 + s = s[2:] + printSlice(s) + // 舍弃前两个值 + s = s[1:] + printSlice(s) + } + func printSlice(s []int) { + fmt.Printf("len=%d cap=%d %v\n", len(s), cap(s), s) + } + ``` + +12. go 语言中 int 和 string 类型的转换 + https://www.cnblogs.com/miria-486/p/10706699.html + int 转 string 直接只用`string(0)`这种方式的话 string 出来的不知道是个啥,因此换种方式 + +``` +import "strconv" +//string到int (这个默认是int32类型的) +int,err := strconv.Atoi(string) + +#string到int64 +int64, err := strconv.ParseInt(string, 10, 64) +//第二个参数为基数(2~36), +//第三个参数位大小表示期望转换的结果类型,其值可以为0, 8, 16, 32和64, +//分别对应 int, int8, int16, int32和int64 + +#int到string +string := strconv.Itoa(int) +//等价于 +string := strconv.FormatInt(int64(int),10) + +#int64到string +string := strconv.FormatInt(int64,10) +//第二个参数为基数,可选2~36 +//对于无符号整形,可以使用FormatUint(i uint64, base int) +``` diff --git a/runtime/runtime.go b/runtime/runtime.go new file mode 100644 index 0000000..87f330d --- /dev/null +++ b/runtime/runtime.go @@ -0,0 +1,14 @@ +package runtime + +import ( + "time" + "fmt" +) + +func Time(name string,runFun func()) interface{} { + runAllt := time.Now() + runFun() + runAll := time.Since(runAllt) + fmt.Println(name,"运行时长: ", runAll) + return nil +} \ No newline at end of file