{"id":22283798,"url":"https://github.com/veaba/learn-go","last_synced_at":"2025-07-01T12:04:47.045Z","repository":{"id":40294036,"uuid":"163932573","full_name":"veaba/learn-go","owner":"veaba","description":"go 90+demos","archived":false,"fork":false,"pushed_at":"2022-05-16T18:39:16.000Z","size":1264,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-25T19:53:28.032Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/veaba.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-03T06:31:29.000Z","updated_at":"2021-08-24T06:06:57.000Z","dependencies_parsed_at":"2022-08-09T16:37:40.816Z","dependency_job_id":null,"html_url":"https://github.com/veaba/learn-go","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/veaba/learn-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/veaba","download_url":"https://codeload.github.com/veaba/learn-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/veaba%2Flearn-go/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262959560,"owners_count":23391057,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-03T16:42:19.703Z","updated_at":"2025-07-01T12:04:47.031Z","avatar_url":"https://github.com/veaba.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## 前言\r\n\u003e go，代码组织像c语言，语法和一些特性 像 js\r\n\r\n## TODO\r\n\u003e https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.4.md\r\n\u003e https://github.com/adonovan/gopl.io Go程序设计语言源码\r\n## go命令\r\n\r\n- go fmt 官方格式化代码\r\n- go doc 提取首行注释\r\n- go install 安装go包\r\n- go fix 旧版更新和修改到新版\r\n- go test 轻量级的单元测试框架\r\n## 笔记\r\n- `{`不能单独一行\r\n```gotemplate\r\n\tfunc main()\r\n\t{   //错误\r\n\t\r\n\t}\r\n\r\n```\r\n- `:= `只能在函数内使用\r\n- go文件以小写字母组成，多个部分，以 `_`分割\r\n### 学习链接\r\n\u003e http://c.biancheng.net/view/2.html 例子错误太多之外，还比较适合新手\r\n\r\n\u003e http://tour.studygolang.com/basics/3 可以学习到更多的例子加深使用，适合新手\r\n\r\n\u003e https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/03.9.md 《Go 语言入门指南》\r\n\r\n\u003e https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter01/01.1.html 《Go语言中文网》\r\n\r\n## 安装\r\n\r\n\r\n- windows\r\n\t- 安装地址：\r\n```cmd\r\n\r\n\u003e go run hello.go  # 解析器执行运行\r\n\r\n\u003e go build hello.go # 编程成二进制.exe文件，再运行exe\r\n\r\n\r\n```\r\n\r\n\r\n- linux\r\n \r\n## 疑问\r\n1. 无法使用单引号 ？\r\n2. %d ？ 应该是数值？ 数字 double \r\n3. %T ？？ 打印出来数据类型\r\n4. %V ？？ 打印出来数据类型 Printf()来决定\r\n5. 数组不是一个常量\r\n\t- 不能以 const 来声明\r\n6. go如何声明 一串数组 [5454,\"xxx\",true] \r\n\t- 在go 中，这是一个interface\r\n\t\r\n7. for迭代中 可以使用 空白符 \"_\"省略索引或者值\r\n```gotemplate\r\nfor _,num :=range [545,545,5]{\r\n\tfmt.Println(num)\r\n}\r\n``` \r\n\r\n8. 如何比较 \"2019\"==2019？\r\n9. 查看数据的 类型 类似， js 中的typeof？\r\n10. 怎么打印不出来常量 的位操作\r\n\u003e //fmt.Printf(\"%i\",Big)//怎 \r\n\u003e var i int=999 //期待 int\r\n\r\n11. 发查询反而没有单线程顺序查询快？？\r\n12. 在某些场景下，互斥锁要比读写锁更快！！！\r\n\r\n13. 如何从这个字符串解析自己想要的数据\r\n\u003e \u0026{GET / HTTP/1.1 1 1 map[Accept:[text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3] Accept-Encoding:[gzip, deflate, br] Accept-Language:[zh-CN,zh;q=0.9,es;q=0.8,es-ES;q=0.7] Cache-Control:[max-age=0] Connection:[keep-alive] Upgrade-Insecure-Requests:[1] User-Agent:[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36]] {} \u003cnil\u003e 0 [] false 127.0.0.1:8888 map[] map[] \u003cnil\u003e map[] 127.0.0.1:56865 / \u003cnil\u003e \u003cnil\u003e \u003cnil\u003e 0xc000018200}\r\n\u003e https://studygolang.com/articles/14107#reply1\r\n\r\n\r\n解决：\r\n```text\r\nfmt.Println(\"xxxxx====xxx\")\r\nfmt.Println(\"Method：\", r.Method)\r\nfmt.Println(\"URL：\", r.URL)\r\nfmt.Println(\"Proto：\", r.Proto)\r\nfmt.Println(\"ProtoMajor ：\", r.ProtoMajor)\r\nfmt.Println(\"ProtoMinor ：\", r.ProtoMinor)\r\nfmt.Println(\"Header ：\", r.Header)\r\nfmt.Println(\"Accept: ：\", r.Header[\"Accept\"])\r\nfmt.Println(\"Body  ：\", r.Body)\r\nfmt.Println(\"ContentLength   ：\", r.ContentLength)\r\nfmt.Println(\"TransferEncoding    ：\", r.TransferEncoding)\r\nfmt.Println(\"Close     ：\", r.Close)\r\nfmt.Println(\"Host ：\", r.Host)\r\nfmt.Println(\"Form ：\", r.Form)\r\nfmt.Println(\"PostForm  ：\", r.PostForm)\r\nfmt.Println(\"MultipartForm  ：\", r.MultipartForm)\r\nfmt.Println(\"Trailer   ：\", r.Trailer)\r\nfmt.Println(\"RemoteAddr   ：\", r.RemoteAddr)\r\nfmt.Println(\"RequestURI   ：\", r.RequestURI)\r\nfmt.Println(\"MultipartForm  ：\", r.MultipartForm)\r\nfmt.Println(\"TLS   ：\", r.TLS)\r\nfmt.Println(\"Cancel   ：\", r.Cancel)\r\nfmt.Println(\"Response   ：\", r.Response)\r\n```\r\n14. 语法提示 main redeclared in this block\r\n\u003e 同一个目录下面不能有多个package main\r\n\r\n15. 为什么如何单个return？\r\n```gotemplate\r\n//必须要给值\r\nfunc mongo() {\r\n\tconst x=8;\r\n\treturn  x\r\n}\r\n```\r\n\r\n16. 如何引入不同目录的其他函数go文件\r\n\u003e 需要设置$GOROOT,好编译器有关\r\n17. 同目录的文件如何引用\r\n18. go  语言如何返回json接口数据,map 转json\r\n\r\n```go\r\npackage main\r\n\r\nimport (\r\n\t\"encoding/json\"\r\n\t\"fmt\"\r\n)\r\n\r\ntype Name struct {\r\n\tJob string\r\n}\r\nfunc main()  {\r\n\tmethod1()\r\n\tmethod2()\r\n\r\n}\r\n\r\n/*方法一*/\r\nfunc method1(){\r\n\tname :=Name{Job:\"web前端\"}\r\n\r\n\tfmt.Println(\"name:\",name)\r\n\tbuf,err:=json.MarshalIndent(name,\"\",\"  \")\r\n\tif err!=nil{\r\n\t\treturn\r\n\t}\r\n\tfmt.Println(\"方法一：\",string(buf))\r\n}\r\n/*方法二*/\r\nfunc method2()  {\r\n\tname :=Name{\"Go后端开发\"}\r\n\tjsonData,err:=json.Marshal(name)\r\n\tif err!=nil{\r\n\t\treturn\r\n\t}\r\n\tfmt.Println(\"方法二：\",string(jsonData))\r\n}\r\n\r\n```\r\n\r\n19. go struct 转为map 输出\r\n\r\n```gotemplate\r\ntype Object struct {\r\n\tX int\r\n\tY int\r\n}\r\nm := make(map[string]interface{})\r\ni:=Object{11,33}\r\nj,_:=json.Marshal(i)\r\n_ = json.Unmarshal(j, \u0026m)\r\nfmt.Println(m)\r\n\r\n```\r\n\r\n20. 怎么才可以缩减为11位呢？json后莫名加了两个冒号导致手机加冒号多了两位\r\n\r\n\u003e json转换过程中出现的 \r\n\r\n\r\n21. json 如何处理url 转为对象？两个值存在才数组？\r\n```json\r\n{\"code\":2500,\"data\":{\"error\":[\"bad_verification_code\"],\"error_description\":[\"The code passed is incorrect or expired.\"],\"error_uri\":[\"https://developer.github.com/apps/managing-oauth-apps/troubleshooting-oauth-app-access-token-request-errors/#bad-verification-code\"]},\"message\":\"The code passed is incorrect or expired.\"}\r\n```\r\n\r\n22. go的函数是堆还是栈？\r\n应该是堆吧？\r\n\r\n23. 如何转换url 简写数组\r\n\r\n```js\r\n{\r\n\t\"code\": 0,\r\n\t\"data\": {\r\n\t\t\"access_token\": [\r\n\t\t\t\"dadasd\"\r\n\t\t],\r\n\t\t\"expires_in\": [\r\n\t\t\t\"28800\"\r\n\t\t],\r\n\t\t\"login\": [\r\n\t\t\t\"veaba\"\r\n\t\t],\r\n\t\t\"refresh_token\": [\r\n\t\t\t\"r1.dasdasdsa\"                     // ==\u003e    不要数组\r\n\t\t],\r\n\t\t\"refresh_token_expires_in\": [\r\n\t\t\t\"15638400\"\r\n\t\t],\r\n\t\t\"scope\": [\r\n\t\t\t\"\"\r\n\t\t],\r\n\t\t\"token_type\": [\r\n\t\t\t\"bearer\"\r\n\t\t]\r\n\t},\r\n\t\"message\": \"access-token\"\r\n}\r\n```\r\n\r\n## 主要特性\r\n- 自动垃圾回收\r\n- 丰富的内置类型\r\n- 函数多返回值\r\n- 错误处理\r\n- 匿名函数和闭包\r\n- 类型和接口\r\n- 并发编程\r\n- 反射\r\n- 语言交互性\r\n\r\n## 初试go,hello world\r\n\r\n\u003e go run hello.go  直接执行\r\n\r\n\u003e go build hello.go\r\n\r\n\r\n\r\n```go\r\npackage main //?\r\n\r\nimport \"fmt\"//?\r\n\r\n//一定要main开头\r\nfunc main()  {\r\n\tfmt.Printf(\"hello,worl11d \\n\");\r\n}\r\n```\r\n## 函数包\r\n### \r\n### 函数执行顺序\r\n\r\n- init()\r\n- main()\r\n- customer()\r\n\r\n\r\n### len(a) 只能是string 吗？\r\n\r\n```go\r\npackage main\r\nimport \"fmt\"\r\nfunc main(){\r\n\tvar numbers =make([]int,3,5)\r\n\tprintSlice(numbers)\r\n\t\r\n}\r\n\r\nfunc printSlice(ints []int) {\r\n\tfmt.Println(\"len=%d cap=%d slice=%v\\n\",len(ints),cap(ints),ints)\r\n}\r\n```\r\n\r\n### cap()\r\n测量切片最大长度可以达到多少\r\n\r\n### fmt \r\n\r\n|函数|入参|描述|用例|\r\n|-|-|-|-|\r\n|println(t)||||\r\n|Scan()||||\r\n|Printlh(a,b)||||\r\n|Printf(\"%d\",a)||||\r\n\r\n\r\n### unsafe.Sizeof() 是干嘛的这个函数\r\n\r\n|函数|入参|描述|用例|\r\n|-|-|-|-|\r\n|Sizeof()||||\r\n\r\n### fmt.printf()\r\n\r\n|符号|描述|\r\n|---|---|\r\n|%d|数字,十进制整数|\r\n|%x|十六进制整数|\r\n|%o|八进制整数|\r\n|%b|二进制整数|\r\n|%f|浮点数 3.14149265|\r\n|%g|浮点数 3.165659599656599|\r\n|%e|浮点数 3.21656559e+00|\r\n|%t|布尔型 true，false|\r\n|%c|字符串 unicode 码点|\r\n|%s|字符串|\r\n|%q|带引号字符串 \"abc\" 或字符 'c'|\r\n|%v|内置格式的任何值|\r\n|%T|任何值的类型|\r\n|%%|百分号本身（无操作数）|\r\n\r\n### append()函数\r\n- 增加切片的容量，必须创建一个新的更大的切片并把原来的分片的内容拷贝进来\r\n\r\n```gotemplate\r\nvar n []int\r\nn=append(n,9859,556,6)//[9859,556,6]\r\n\r\n```\r\n### copy()函数\r\n\u003e copy(n1,n)//n 拷贝到 n1\r\n\r\n### fmt.Sprintf()\r\n\u003e fmt.Sprintf(\"%s:%v\",header,rand.Int31())\r\n\r\n### rand.Int31()\r\n\r\n### time.Sleep(time.Second)\r\n\r\n### time.Second\r\n\r\n### string-\u003efloat strconv.ParseFloat() \r\n### string-\u003eint strconv.ParseInt() \r\n### string-\u003ebool strconv.ParseBool() \r\n\r\n### int-\u003estring\r\n\r\n\r\n```gotemplate\r\nstr1 :=strconv.Itoa(i) //1 \r\n\r\nstr2 :=fmt.Srpintf(\"%d\",i)//2\r\n\r\nstr3 :=strconv.formatInt()//3\r\n\r\n```\r\n\r\n### int-\u003efloat float(i)\r\n\r\n```gotemplate\r\n\tfloat(i)\r\n\r\n```\r\n\r\n### int-\u003ebool bool(i)\r\n\r\n### float-\u003estring\r\n\r\n```gotemplate\r\nstr1 :=strconv.Itof(f) //1 Itoa方法\r\nstr2 :=fmt.Sprintf(\"%f\",f) Sprintf 方法\r\nstr3 :=strconv.FormatFloat()//FormatFloat 转换\r\n```\r\n\r\n### float-\u003eint int(i)\r\n\r\n### float-\u003ebool bool(i)\r\n\r\n### bool-\u003estring  \r\n```gotemplate\r\nstr1 :=fmt.Sprintf(\"%d\",b)\r\nstr2 :=strconv.FormatBool()\r\n```\r\n### bool-\u003eint int(i)\r\n\r\n### bool-\u003efloat float(i)\r\n\r\n### byte-\u003estring string(byte)\r\n\r\n### byte-\u003eint/bool/float encoding/binary\r\n\r\n### ini/bool/float -\u003e byte encoding/binary\r\n\r\n### log.Fatal 似乎是一个打印错日志\r\n\r\n### defer \r\n用途\r\n- defer file.Close()关闭文件流\r\n- defer mu.Unlock() 解锁一个加锁的资源\r\n\u003emu.Lock()\r\n\u003edefer mu.Unlock()\r\n\r\n- 打印最终的报告\r\n\u003edefer EndPrint()\r\n\r\n- 关闭数据库链接\r\n\u003edefer disconnectDB()\r\n\r\n## 基础代码结构\r\n\r\n|描述|用例|\r\n|----|----|\r\n|包声明| |\r\n|引入包| |\r\n|函数| |\r\n|变量| |\r\n|语句\u0026表达式| |\r\n|注释| |\r\n|// -\u003e 标记| |\r\n|关键字| |\r\n|常量| |\r\n|字符串| |\r\n|符号| |\r\n|fm| |\r\n|.| |\r\n|Println| |\r\n|(| |\r\n|\"hello world\"| |\r\n|)| |\r\n\r\n## 保留字\r\n### 关键字\r\n\r\n|关键字|描述|\r\n|----|----|\r\n|break ||\r\n|default ||\r\n|func | |\r\n|interface | |\r\n|select | |\r\n|case | |\r\n|defer | |\r\n|go | |\r\n|map | |\r\n|struct | |\r\n|chan | |\r\n|else | |\r\n|goto | |\r\n|package | |\r\n|switch | |\r\n|const | |\r\n|fallthrougt | |\r\n|if | |\r\n|range | |\r\n|type | |\r\n|continue | |\r\n|for | |\r\n|imort | |\r\n|return | |\r\n|var | |\r\n\r\n### 预定义标识符\r\n\r\n|符号|描述|\r\n|----|----|\r\n|append | |\r\n|bool | |\r\n|byte | |\r\n|cap ||\r\n|close | |\r\n|complex | |\r\n|complex64 | |\r\n|complex128 | |\r\n|uint | |\r\n|uint8 | |\r\n|uint16 | |\r\n|uint32 | |\r\n|uint64 | |\r\n|uintptr | |\r\n|copy | |\r\n|false | |\r\n|float32 | |\r\n|float64 | |\r\n|imag | |\r\n|int ||\r\n|int8 | |\r\n|int16 | |\r\n|int32 | |\r\n|iota | |\r\n|len ||\r\n|make | |\r\n|new ||\r\n|nil ||\r\n|panic | |\r\n|print | |\r\n|println | |\r\n|real | |\r\n|recover | |\r\n|string | |\r\n|true | |\r\n\r\n## 声明\u0026\u0026变量\r\n\r\n\r\n\r\n### 声明变量\r\n\r\n- 指定变量类型，如果没有初始值，变量默认为零值\r\n\u003e var s ini;\r\n\r\n- 根据值自行判定变量类型\r\n\u003e var f= true\r\n\r\n- 省略var `:=` 左侧如果没有声明新的变量，会产生编译错误\r\n- 全局声明的变量允许不被使用\r\n- 局部声明的变量，必须要使用，否则会造成编译器报错\r\n```gotemplate\r\nvar val int\r\nval := //错误，左侧没有声明新的变量\r\nvar,t :=1,2//不会错误\r\n\r\n```\r\n\r\n```gotemplate\r\nvar age int\r\nvar str string = \"I love the world\"//go 中 这个string 类型是可以省略的\r\n\r\n```\r\n\r\n- 必须空格区分\r\n- 被声明的变量，必须使用，对于局部作用域来说，但全局是允许声明可不使用。\r\n- 可在一行声明多个变量。var e,f =123,\"hello\" =\u003e g,h:=123,\"world\"，并行赋值|同时赋值\r\n- 不能对变量，重复声明\r\n- 交换两个变量的值，前提是类型相同 a,b=b,a\r\n- 空白标识符，_ 用于抛弃值 _,b=5,7. _ \r\n- 不能以数字开头\r\n- 不能使用关键字\r\n- 不能使用运算符\r\n\r\n### 变量作用域\r\n\r\n- 函数内定义的变量：局部变量\r\n- 函数外定义的变量：全局变量\r\n- 函数定义中的变量：形式参数\r\n\r\n### 初始化局部和全局变量\r\n- int 初始化 0\r\n- float32 初始化 0\r\n- pointer 初始化 nil\r\n### `:=` 短变量声明，省略var 关键字\r\n- 不能在函数外使用，只能在函数内使用\r\n- 必须不能被声明过\r\n\r\n### 常量\r\nconst 声明\r\n\r\n### 零值\r\n- `0` 数值0\r\n- `false` 布尔 false\r\n- `\"\"` 空字符串\r\n\r\n## 值类型和引用类型\r\n\r\n### 值类型（*）\r\n\r\n\t值传递是指在调用函数时将实际参数复制一份传递到函数中，这样在函数中如果对参数进行修改，将不会影响到实际参数。\r\n\r\n\u003e (基本类型，存储在栈中，常量)  j=i 将i的值进行拷贝,\u0026i 获取i的内存地址。每次的地址可能不一样\r\n\r\n\r\n- 以下基本类型都属于值类型\r\n\t- int\r\n\t- float\r\n\t- bool\r\n\t- string\r\n\u003e 且变量都直接指向存在内存中的值\r\n\r\n- `j = i`,是内存中将i的值进行拷贝，可通过`\u0026i`获取变量 `i`的内存地址,每次内存地址可能不一样， \r\n- 值类型的变量的值都存在 `栈` 中\r\n\r\n|类型|描述|\r\n|----|----|\r\n|int||\r\n|int| |\r\n|float| |\r\n|bool| |\r\n|string| |\r\n\r\n- 常量\r\n常量用于枚举\r\n```gotemplate\r\nconst {\r\n    Unkown=0\r\n    Female=1\r\n    male=2\r\n}\r\n```\r\n- iota(特殊常量，可以被编译器修改的常量)???\t\r\n    \r\n|||||||||\r\n|-|-|-|-|-|-|-|-|\r\n|const (|||\\|||const (||\r\n||a=iota||\\||||a=iota||\r\n||b=iota||=\u003e|||b||\r\n||c=iota||\\||||c||\r\n|)|||\\|||)|||\r\n\r\n```gotemplate\r\nconst (  \t\t\t\r\n\ta=iota\t\t\t\t\r\n\tb=iota     =\u003e\t\t\r\n\tc=iota\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n```\r\n\r\n\r\n\r\n- iota 用法\r\n\r\n```gotemplate\r\npackage main\r\nimport \"fmt\"\r\nfunc main(){\r\n    const (\r\n        a=iota\r\n        b\r\n        c\r\n        d =\"haha\"\r\n        e\r\n        h\r\n        i\r\n        f=100\r\n        g=iota\r\n        i\r\n    )\r\n}\r\n```\r\n\r\n\r\n### 引用类型（*）\r\n\r\n\t引用传递是指在调用函数时将实际参数的地址传递到函数中，那么在函数中对参数所进行的修改，将影响到实际参数。\r\n\r\n\u003e (复杂的数据结构，)r2=r1 只有引用被拷贝\r\n\r\n## 数据类型\r\n\r\n\r\n### 布尔类型\r\n- true \r\n- false\r\n\r\n### 数字类型\r\n- 整形int\r\n    - uint8  `0 ~ 255`\r\n    - uint16 `0 ~ 65535`\r\n    - uint32 `0 ~ 4294967295`\r\n    - uint64 `0 ~ 188446744073709551615`\r\n    - int8   `-128 ~ 127`\r\n    - int16  `-32768 ~ 32767`\r\n    - int32  `-2147483648 ~ 2147483647`\r\n    - int64  `-9223372036854775808 ~ 9223372036854775807`\r\n- 浮点\r\n\t- float32 IEEE-754 32\r\n    - float64 IEEE-754 64\r\n    - complex64 32位实数和虚数\r\n    - complex128 64位实数和虚数 (实数：有理数+无理数) （复数：实数+虚数）\t\r\n- 其他\r\n\t- byte uint8\r\n    - rune ini32\r\n    - uint 32/64\r\n    - int 与uint\r\n    - uintptr 无符号整形，存放一个指针pointer\r\n    \r\n### 字符串类型\r\n- UTF-8编码标识的 \r\n- unicode文本\r\n\r\n### 派生类型\r\n- 指针类型 Pointer\r\n- 数组类型\r\n- 结构化类型 struct\r\n- Channel 类型\r\n- 函数类型\r\n- 切片类型\r\n- 接口类型 interface\r\n- Map 类型\r\n\r\n## 运算符\r\n- :=  (赋值操作符)\r\n```gotemplate\r\n\tvar a =5;  =\u003e a:=5\r\n    var b =false; =\u003e b:=false\r\n```\r\n### 算数运算符\r\n- +\r\n- -\r\n- *\r\n- /\r\n- %\r\n- ++\r\n- --\r\n\r\n### 关系运算符(都返回：布尔值) -\u003e \r\n\r\n|符号|用例|\r\n|----|----|\r\n|==  |a==b|\r\n|!=  |a!=b|\r\n|\u003e   |a\u003eb |\r\n|\u003c   |a\u003cb |\r\n|\u003e=  |a\u003e=b|\r\n|\u003c=  |a\u003c=b|\r\n\r\n### 逻辑运算符\r\n- %% 逻辑 AND 运算符，两边都是true 才true ，否则false  (a\u0026\u0026b)\r\n- || 逻辑 OR  有一个true 则true。否则false\t\t\t(a||b)\r\n- |  逻辑 NOT 条件为true，则逻辑为false 否则true\t\t!(a\u0026\u0026b)\r\n### 位运算符(都是操作二进制)\r\n- \u0026\t与运算符，双目运算符。(a\u0026b) a与b的二进位 相与  (0-0 、1-0、0-1 为0；1-1为1) \r\n\r\n| 8 | 7 | 6 | 5 |  4| 3 | 2 | 1 |\r\n|---|---|---|---|---|---|---|---|\r\n| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |\r\n| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |\r\n| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |\r\n\r\n- |\t或运算符，双目运算符。(a|b) a与b的二进位 相或 （0-0 为,1-1、1-0、0-1 为1）\r\n\r\n| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |\r\n|---|---|---|---|---|---|---|---|\r\n| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |\r\n| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |\r\n| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 |\r\n\r\n- ^ \t异或运算符，双目运算符。(a^b) a与b的二进位 想异或。（0-0,1-1 都为0,1-0,0-1 为1）\r\n\r\n| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |\r\n|---|---|---|---|---|---|---|---|\r\n| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |\r\n| 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 |\r\n| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 |\r\n\r\n- \u003c\u003c\t左移运算符，双目运算符。(a\u003c\u003c2) a的二进位，整体向左边移动2个位\r\n\r\n| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |\r\n|---|---|---|---|---|---|---|---|\r\n| 0 | 0 | 1 | 1 | 1 |1 | 0  | 0 |\r\n| 1 | 1 | 1 | 1 | 0 |0 | 0  | 0 |\r\n\r\n- \\\u003e\u003e\t右移运算符，双目运算符。(a\u003e\u003e2) a的二进位，整体向右边移动，补0\r\n\r\n| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |\r\n|---|---|---|---|---|---|---|---|\r\n| 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |\r\n| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 |\r\n\r\n### 赋值运算符\r\n\r\n|符号 | 用例           |\r\n|----|----------------|\r\n|=   | c=a+b          |\r\n|+=\t | c+=a   =\u003e c=c+a|\r\n|-=\t | c-=a   =\u003e c=c-a|\r\n|*=\t | c*=a   =\u003e c=c*a|\r\n|/=\t | c/=a   =\u003e c=c/a|\r\n|%=\t | c%=a   =\u003e =c%a|\r\n|\u003c\u003c= |\tc\u003c\u003c=2 =\u003e c=c\u003c\u003c2|\r\n|\u003e\u003e= |\tc\u003e\u003e=2 =\u003e c=c\u003e\u003e2|\r\n|\u0026=\t | c\u0026=2   =\u003e c=c\u00262|\r\n|^=\t | c^=2   =\u003e c=c^2|\r\n|｜= | c\\｜=2   =\u003e c=c\\｜2|\r\n### 其他运算符\r\n\r\n|符号 |描述|       用例           |\r\n|----|----|-----------------------|\r\n|\u0026|返回变量存储地址|  \u0026a 给出实际地址|\r\n|*|指针变量       |*a 是一个指针变量|\r\n\r\n### 运算符优先级\r\n\u003e (使用括号提升表达式运算符优先级)\r\n\r\n|优先级|运算符|\r\n|----|-------------|\r\n|7|^ !             |\r\n|6|* / % \u003c\u003c \u003e\u003e \u0026 \u0026^|\r\n|5|+ - ^           |\r\n|4|== != \u003c \u003c= \u003e= \u003e |\r\n|3|\u003c-              |\r\n|2|\u0026\u0026              |\r\n|1|    |           |\r\n    \r\n## 语句\r\n### 条件语句\r\n\r\n- if\r\n```gotemplate\r\nif a\u003e20{\t\t\r\n\t\t\t\t\t\t\t\r\n}\t\r\n```\r\n\r\n- if ..else\r\n```gotemplate\r\nif a\u003e20{\r\n\r\n}else{\r\n\r\n}\r\n```\r\n\r\n- if ..if\r\n\r\n```gotemplate \r\nif a\u003e20{\r\n    if a==30 { \r\n\r\n    }\r\n}\r\n```\r\n- switch\r\n\r\n```gotemplate\r\n\r\npackage main\r\n\r\nimport \"fmt\"\r\n\r\nfnc main(){\r\n\tswitch var1 {\t\t\r\n\tcase var1:\t\t\t\r\n        ...\t\t\t\t\r\n\tcase var2:\t\t\t\r\n        ...\t\t\t\t\r\n\tcase var 3\t\t\t\r\n        ...\t\t\t\t\r\n\tdefault:\t\t\t\r\n        ....\t\t\t\r\n\t}\t\r\n}\r\n\r\n```\r\n\t\t\t\t\r\n- select \r\n\u003e !!!select 语句类似于 switch 语句，但是select会随机执行一个可运行的case。如果没有case可运行，它将阻塞，直到有case可运行。\r\n\r\n```gotemplate\r\nselect{\t\t\t\t\t\t\r\n    case communication clause:\t\r\n        statement(s);\t\t\t\r\n    case communication clause:\t\r\n        statement(s);\t\t\t\r\n}\t\t\t\t\t\t\t\t\r\n```\r\n\r\n1. case 都必须是一个通信？？！！\r\n2. channel表达式都会求值？？\r\n3. 所有被发送的表达式都会被求值？？\r\n4. 如果任意某个通信都可以运行，它就会执行，其他被忽略\r\n5. 多个case都可以运行，select随机公平的选出一个执行，其他不会执行\r\n6. 否则 如果有default，则执行\r\n7. 如果没有default 语句，select将会阻塞，直到某个通信可以运行，go不会重新对channel或值进行求值\r\n\t\r\n### 循环控制语句\r\n- 只有一种循环结构，for 循环\r\n- for\r\n- for ...for\r\n\r\n```gotemplate\r\npackage main\r\nimport \"fmt\"\r\n\r\nfunc main(){\r\n\tfor i,x:= range numbers {\r\n        fmt.Printf(\"第 %d 位 x 的值 = %d\\n\", i,x)\r\n    }\t\t\r\n}\r\n\r\n```\r\n\r\n- break\t-\u003e 中断for循环或跳出switch\r\n- continue\t-\u003e\t跳过当前循环剩下语句，进行下一轮循环\r\n- goto\t-\u003e\t将控制转移到被标记的语句\r\n- 无限循环，条件语句永远不为false则无限循环\t\r\n\r\n### 判断字符串为空\r\n- if str == \"\" {}\r\n- if len(str)==0{}\r\n## 数组\r\n- 如何声明 一串数组 [5454,\"xxx\",true]\r\n### 声明数组\r\n\tvar variable_name [SIZE] variable_type //语法\r\n\t\r\n\tvar balance[10] float // 定义一个长度为10的 float32 类型\r\n\t\r\n### 初始化数组\r\n\tvar balance = [5] float32{9.6,65.5,6.6,.6,9.5,9.66}//err\r\n\tvar balance = [5] float32{9.6,65.5,6.6,.6,9.5}//success\r\n- 初始化数组中 `{}` 的元素个数不能大于 `[]` 的数字\r\n- `[]`没有设置数字，则自动设置\t\r\n- 如果`{}`里面的元素个数小于 `[]`定义的，则会自动补全0.\r\n\r\n### 多维数组（省略）\r\n\r\n## 指针\r\n- 一个指针变量指向一个值的内存地址\r\n\r\n## 结构体\r\n\r\n- @TODO 数组可以存储同一个类型的数组\r\n- @TODO 数组如何支持结构体 arr=[999,\"899\",false]\r\n- 那只是属性而已，怎么去调用方法？？\r\n\r\n```gotemplate\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"math\"\r\n)\r\n\r\ntype Class struct {\r\n\tx,y float64\r\n}\r\n\r\n// * 地址\r\nfunc (v *Class) Woo() float64  {\r\n\tfmt.Println(Class{})\r\n\treturn math.Sqrt(v.x*v.x+v.y*v.y)\r\n}\r\n\r\nfunc main()  {\r\n\tv :=\u0026Class{3,4}\r\n\tfmt.Println(v.Woo())\r\n\tfmt.Println(v)\r\n}\r\n\r\n```\r\n\r\n- 结构体实例\r\n```go\r\npackage main\r\nimport \"fmt\"\r\n\r\ntype Books struct {\r\n\ttitle string\r\n\tauthor string\r\n\tpage int\r\n}\r\n\r\nfunc main()  {\r\n fmt.Println(Books{\"三百六十行\",\"孙悟空\",999})\r\n \r\n // 当然也可以使用key value\r\n fmt.Println(Books{title:\"哇哈哈\",author:\"宗庆后\",page:666})\r\n \r\n // 忽略字段为 0 或 空\r\n\r\n\r\n fmt.Println(Books{title:\"演员的自我修养\",author:\"无名氏\"})\r\n}\r\n\r\n\r\n```\r\n\r\n- 结构体语法\r\n```gotemplate\r\n//\r\n type struct_variable_type struct{\r\n    member definition\r\n    member definition\r\n    ...\r\n    member definition\r\n }\r\n \r\n ```\r\n \r\n### 结构体指针\r\n\r\n## 切片(slice)\r\n[slice切片](./slice.go)\r\n\r\n- 对数组的抽象\r\n- “动态数组”——切片\r\n- 长度不限制\r\n- make函数创建切片\r\n\r\n### 切片如何转数组\r\n\r\n### 定义切片\r\n\u003e var xx []type //不需要说明长度\r\n\r\n### 切片初始化\r\n\u003e s:=[] int {1,2,3}\r\n\r\n## 语言范围 TODO\r\n- range 关键字用于for循环中 迭代 数组、切片、通道、集合的TODO?\r\n- range在数组、切片中它返回元素和索引和索引对应的值\r\n- range在集合中，返回key-value对 的key值\r\n\u003e https://www.runoob.com/go/go-range.html\r\n\r\n## interface 接口\r\n\r\n\r\n## goroutine \r\n\r\n问题:\r\n- goroutine 还可以继续goroutine 吗？\r\n\r\n### 概念与总结\r\n- 线程(Thread):\r\n  - 有称：轻量级进程(Lightwight process,LWP)\r\n  - 程序执行流的最小单元\r\n  - 标准线程包括：线程ID，指令指针（PC），寄存器集合，堆栈\r\n  - 线程是进程的一个实体，系统独立调度分配的单位\r\n  - 无法拥有系统资源，仅个别必备资源\r\n  - 可与同属一个进程的其他线程共享进程的全部资源\r\n- 协程(Coroutine):\r\n  - 又称：微线程与子例程（函数）\r\n  - 程序组件\r\n  - 协程比较灵活，实践中没有比子例程广泛\r\n  - 共享堆，不共享栈\r\n\r\n\r\n## 并发concurrent\r\n![concurrent](./src/images/concurrent.jpg)\r\n\r\n### go并发模型：CSP(communicating sequential processes)\r\n\r\n- go`不要以共享内存的方式来通信，相反，要通过通信来共享内存。`\r\n\r\n\r\n## 通道channel\r\n\r\n\r\n## 函数\r\n\r\n```gotemplate\r\npackage main\r\nimport \"fmt\"\r\n\r\nfunc hello([参数list])[return_types]{\r\n            //functions body\r\n}\r\n```\r\n\r\n1. func 声明函数\r\n2. hello 函数名称，\r\n3. 函数签名= 函数名+参数列表\r\n4. 实参，参数类型、顺序、参数个数，可选\r\n5. return_types 返回类型，返回返回一列值，return_types 是该列值的数据类型，不是必须，有些功能不需要返回值\r\n6. 函数体 里面搞什么\r\n7. 返回多个值\r\n\r\n```go\r\npackage main\r\nimport \"fmt\"\r\nfunc main()  {\r\n    world(\"9\",\"2\")\r\n}\r\nfunc world(x,y string)(string,string){\r\n    return x,y\r\n}\r\n```\r\n\r\n8. 函数如果使用参数，则该变量成为函数的形参\r\n9. 形参类似定义在函数体内的 局部变量\r\n10. 值传递，在函数体内去修改，不会影响，因为是属于基本类型的的拷贝值\r\n11. 引用传递参数的话，在函数体内去修改，会影响外部参数\r\n12. 函数可作为值，被赋值给其他o变量\r\n13. 最少要有一个main函数\r\n### 函数闭包\r\n\r\n```go\r\npackage main \r\nimport \"fmt\"\r\nfunc getSequence() func() int{\r\n    i:=0//var i int = 0\r\n    return  func() int{\r\n        i+=1\r\n        return i\r\n    }\r\n}\r\nfunc main(){\r\n    nextNumber :=getSequence()//nextNumber 为一个函数，值为0\r\n    fmt.Println(nextNumber())\r\n    fmt.Println(nextNumber())\r\n    fmt.Println(nextNumber())\r\n    preNumber :=getSequence()//新的函数\r\n    fmt.Println(preNumber())\r\n    fmt.Println(preNumber())\r\n}\r\n```\r\n### 递归函数\r\ngo 实现 斐波那契数列函数\r\n\r\n```go\r\n/**\r\n@desc 递归 recursion\r\n\r\n*/\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n)\r\n\r\n//\r\nfunc recursion(num int) int {\r\n\tif num \u003c= 1 {\r\n\t\treturn 1\r\n\t}\r\n\treturn recursion(num-1) + recursion(num-2)\r\n}\r\n\r\nfunc main() {\r\n\tvar a = recursion(8)\r\n\tfmt.Println(a)\r\n}\r\n\r\n```\r\n\r\ngo 通过闭包实现斐波那契数列\r\n\r\n```go\r\npackage main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main() {\r\n\tf := fibonacci()\r\n\tfor i := 0; i \u003c 10; i++ {\r\n\t\tfmt.Println(f())\r\n\t}\r\n}\r\n\r\n// fibonacci 函数会返回一个返回 int 的函数。\r\nfunc fibonacci() func() int {\r\n\tx,y:=0,1\r\n\treturn func() int {\r\n\t\ttemp := x\r\n\t\tx, y = y, (x + y)\r\n\t\treturn temp\r\n\t}\r\n}\r\n```\r\n\r\n###  传递变长参数\r\n\r\n\u003e func myFunc(a, b, arg ...int) {}\r\n\r\n```gotemplate\r\nfunc Greeting(prefix string, who ...string)\r\nGreeting(\"hello:\", \"Joe\", \"Anna\", \"Eileen\")\r\n```\r\n### 内置函数\r\n\r\n来源：https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.6.md\r\n\r\n|名称|说明|\r\n|---|---|\r\n|close|用于管道通信|\r\n|len、cap|len 用于返回某个类型的长度或数量（字符串、数组、切片、map 和管道）；cap 是容量的意思，用于返回某个类型的最大容量（只能用于切片和 map）|\r\n|new、make|new 和 make 均是用于分配内存：new 用于值类型和用户定义的类型，如自定义结构，make 用于内置引用类型（切片、map 和管道）。它们的用法就像是函数，但是将类型作为参数：new(type)、make(type)。new(T) 分配类型 T 的零值并返回其地址，也就是指向类型 T 的指针（详见第 10.1 节）。它也可以被用于基本类型：`v := new(int)`。make(T) 返回类型 T 的初始化之后的值，因此它比 new 进行更多的工作（详见第 7.2.3/4 节、第 8.1.1 节和第 14.2.1 节）**new() 是一个函数，不要忘记它的括号**|\r\n|copy、append|用于复制和连接切片|\r\n|panic、recover|两者均用于错误处理机制|\r\n|print、println|底层打印函数，在部署环境中建议使用 fmt 包|\r\n|complex、real imag|用于创建和操作复数|\r\n\r\n\r\n\r\n## 时间Date\r\n更多 http://docs.studygolang.com/pkg/time/\r\n\r\n\r\n## 字符\r\n\r\n- 字符串链接使用 `+`来实现\r\n- `\\n` 换行符\r\n- `\\r` 回车符\r\n- `\\t` tab键\r\n- `\\u` 或 `\\U` unicode字符\r\n- `\\\\`：反斜杠自身\r\n\r\n### 方法\r\n更多：http://docs.studygolang.com/pkg/strings/\r\n\r\n- strings.HasPrefix(s,prefix string) //bool prefix 开头\r\n- strings.HasSuffix(s,suffix string) //bool suffix 结尾\r\n- strings.Contains(s,substr string) //bool 判断字符串包含\r\n- strings.Index(s,str string) int //索引，-1不包含\r\n- strings.LastIndex(s,str string) int 从最后出现的位置\r\n- strings.IndexRune(s string,r rune) int 如果需要查询非 ASCII 编码的字符在父字符串中的位置，建议使用以下函数来对字符进行定位：\r\n- strings.Replace(str,old,new,n) `str`字符串，前`n`个字符串` old`替换为`new`，并返回一新的字符串,n=-1则替换 所有`old` 为 `new`\r\n- strings.Count(s,str,string) //int 计算字符串 str 在字符串 s 中出现的非重叠次数：\r\n- strings.Repeat(s,count int) //string 重复字符串\r\n- strings.ToLower(s) 小写\r\n- strings.ToUpper(s) 大写\r\n- strings.TrimSpace(s)提出字符串开头和结尾的空白符号\r\n- strings.Trim(s,\"cut\") 将结尾和开头的`cut`去除\r\n- strings.TrimLeft(s)\r\n- strings.TrimRight(s)\r\n- strings.Join(sl [] string,sep string)//\"GO1 - The ABC of Go - 25 - \"-\u003e \"GO1;The ABC of Go;25\"\r\n- strings.Fields(str) //todo? \"The quick brown fox jumps over the lazy dog\"-\u003e [\"The quick brown fox jumps over the lazy dog\"]\r\n- strings.Split(s,str)//\"GO1|The ABC of Go|25\"-\u003e[GO1 The ABC of Go 25]\r\n\r\n### 字符串与其他类型转换，通过 `strconv` 包实现\r\n更多 http://docs.studygolang.com/pkg/strconv/\r\n\r\n\r\n- int 转字符串 \r\n\u003e strconv.Itoa(int)\r\n\r\n## 标准库包\r\n|包名   |描述   |\r\n|---    |---   |\r\n|bufio\t|带缓冲的 I/O 操作|\r\n|bytes\t|实现字节操作|\r\n|container\t|封装堆、列表和环形列表等容器|\r\n|crypto\t|加密算法|\r\n|database\t|数据库驱动和接口|\r\n|debug\t|各种调试文件格式访问及调试功能|\r\n|encoding\t|常见算法如 JSON、XML、Base64 等|\r\n|flag\t|命令行解析|\r\n|fmt\t|格式化操作|\r\n|go|\tGo 语言的词法、语法树、类型等。可通过这个包进行代码信息提取和修改|\r\n|html\t|HTML 转义及模板系统|\r\n|image\t|常见图形格式的访问及生成|\r\n|io\t|实现 I/O 原始访问接口及访问封装|\r\n|math|\t数学库|\r\n|net|\t网络库，支持 Socket、HTTP、邮件、RPC、SMTP 等|\r\n|os|\t操作系统平台不依赖平台操作封装|\r\n|path\t|兼容各操作系统的路径操作实用函数|\r\n|plugin|\tGo 1.7 加入的插件系统。支持将代码编译为插件，按需加载|\r\n|reflect|\t语言反射支持。可以动态获得代码中的类型信息，获取和修改变量的值|\r\n|regexp\t|正则表达式封装|\r\n|runtime|\t运行时接口|\r\n|sort\t|排序接口|\r\n|strings|\t字符串转换、解析及实用函数|\r\n|time\t|时间接口|\r\n|text\t|文本模板及 Token 词法器|\r\n\r\n## http\r\n\r\n- w http.ResponseWriter 返回的消息是byte类型\r\n\r\n\u003ew.Write([]byte(\"hello world\"\"))\r\n\r\n\r\n```go\r\n/**\r\n\r\n@desc go 建立 http 服务器\r\n\r\n*/\r\npackage main\r\n\r\nimport (\r\n\t\"io\"\r\n\t\"log\"\r\n\t\"net/http\"\r\n)\r\n\r\nfunc main()  {\r\n\t\tgoServer()\r\n}\r\n\r\nfunc goServer() {\r\n\thttp.HandleFunc(\"/\",httpServer)\r\n\terr := http.ListenAndServe(\":8888\",nil)\r\n\tif err !=nil {\r\n\t\tlog.Fatal(\"ListenAndServe\",err)\r\n\t}\r\n}\r\n\r\nfunc httpServer(w http.ResponseWriter,req *http.Request)  {\r\n\t_, _ = io.WriteString(w, \"hello,world11\\n\")\r\n}\r\n\r\n```\r\n\r\n\r\n## 内置依赖包\r\n\r\n\u003e 摘录自 https://studygolang.com/static/pkgdoc/main.html\r\n\r\n|main|sub|描述|\r\n| --- | --- | --- |\r\n|archive|       | 档案| \r\n|       | tar | tar包实现tar格式压缩文件存取| \r\n|       | zip | zip提取zip档案文件读写 | \r\n| bufio  | | 带缓存I/O操作 | \r\n| builtin | | 为Go预声明标识符提供了文档 | \r\n| bytes  | | 操作[]byte的常用函数 | \r\n| compress  | | | \r\n|   | bzip3| | \r\n|   | flate| | \r\n|   | gzip | | \r\n|   | lzw| | \r\n|   | zlib| | \r\n| container  | | | \r\n|   | heap| | \r\n|   | list| | \r\n|   | ring| | \r\n| context  | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n|   | | | \r\n\r\n## Http\r\n- https://godoc.org/net/http#Request.Method\r\n\u003e http - GoDoc\r\n## 算法\r\n\r\n### 倍数算法，此时for 也类似while\r\n```go\r\npackage main\r\n\r\nimport \"fmt\"\r\n\r\nfunc main()  {\r\n\tsum :=1\r\n\tfor sum \u003c64{\r\n\t\tfmt.Println(sum)\r\n\t\tsum+=sum\r\n\t}\r\n\tfmt.Println(\"end:\",sum)\r\n}\r\n\r\n\r\n/*\r\n  1\r\n  2\r\n  4\r\n  8\r\n  16\r\n  32\r\n  sum:64\r\n  */\r\n```\r\n\r\n### 牛顿法实现开平方函数\r\n\r\n简单10次循环找差值\r\n\r\n```go\r\n\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n)\r\n\r\nfunc Sqrt(x float64) float64 {\r\n\tz := float64(1)\r\n\r\n\tfor i:=0;i\u003c10 ; i++{\r\n\t\tz -= (z*z - x) / (2 * z)\r\n\t\tfmt.Println(z)\r\n\t}\r\n\treturn z\r\n}\r\n\r\nfunc main() {\r\n\tfmt.Println(Sqrt(8))\r\n}\r\n\r\n```\r\n\r\n- 完善型牛顿法\r\n```go\r\n\r\npackage main\r\n\r\nimport (\r\n\t\"fmt\"\r\n)\r\n\r\nfunc Sqrt(x float64) float64 {\r\n\tconst E = 0.000001\r\n\tz := float64(1)\r\n\tk := float64(0)\r\n\tfor ; ; z -= (z*z - x) / (2 * z) {\r\n\t\tif z-k \u003c= E\u0026\u0026z-k \u003e= -E {\r\n\t\t\treturn z\r\n\t\t}\r\n\t\tk = z\r\n\t}\r\n}\r\n\r\nfunc main() {\r\n\tfmt.Println(Sqrt(8))\r\n}\r\n\r\n```\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Flearn-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fveaba%2Flearn-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fveaba%2Flearn-go/lists"}