{"id":16599225,"url":"https://github.com/collabh/go-quick-start","last_synced_at":"2025-03-07T13:14:28.423Z","repository":{"id":105163567,"uuid":"238619869","full_name":"collabH/go-quick-start","owner":"collabH","description":"go语言快速入门","archived":false,"fork":false,"pushed_at":"2020-02-07T10:33:03.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2023-03-04T05:46:52.567Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/collabH.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-02-06T06:07:25.000Z","updated_at":"2024-06-19T07:49:09.225Z","dependencies_parsed_at":null,"dependency_job_id":"35fa5c34-a996-433c-87d3-cacce8825451","html_url":"https://github.com/collabH/go-quick-start","commit_stats":null,"previous_names":[],"tags_count":0,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/collabH%2Fgo-quick-start","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/collabH%2Fgo-quick-start/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/collabH%2Fgo-quick-start/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/collabH%2Fgo-quick-start/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/collabH","download_url":"https://codeload.github.com/collabH/go-quick-start/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242394443,"owners_count":20120941,"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-10-12T00:10:43.320Z","updated_at":"2025-03-07T13:14:28.407Z","avatar_url":"https://github.com/collabH.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go快速入门\n## 什么是Go?\n\u003e go是一门并发支持、垃圾回收的编译型系统编程语言，旨在创造一门具有在静态编译语言的高性能和动态语言的\n\u003e高效开发之间拥有良好平衡点的一门语言。\n\n## Go的主要特点有哪些\n* 类型安全和内存安全\n* 以非常直观和极低代价的方案实现高并发\n* 高效的垃圾回收机制\n* 快速编译(同时解决C语言中头文件太多的问题)\n* 为多核计算机提供性能提升的方案\n* UTF-8编码支持\n\n## 常用命令\n### Go命令\n```text\n在命令行输入go即可查看所有支持的命令\n```\n### 常用命令\n- go get:获取远程包\n- go run:直接运行程序\n- go build:测试编译，检查是否有编译错误\n- go fmt:格式化源码\n- go install:编译包文件并编译整个程序\n- go test:运行测试文件\n- go doc:查看文档\n\n## Go内置关键字\n```text\nbreak\ndefault\nfunc\ninterface\ncase\ndefer\ngo \nmap\nchan\nelse\ngoto\npackage\ncontinue\nfor\nimport\nreturn\nselect\nstruct\nswitch\ntype\nvar\n```\n### 使用方式\n- Go程序是通过 package 来组织的（与python类似）\n- 只有 package 名称为 main 的包可以包含 main 函数\n- 一个可执行程序 有且仅有 一个main包\n\n- 通过 import 关键字来导入其它非 main 包\n- 通过 const 关键字来进行常量的定义\n- 通过在函数体外部使用 var 关键字来进行全局变量的声明与赋值\n- 通过 type 关键字来进行结构(struct)或接口(interface)的声明\n- 通过 func 关键字来进行函数的声明\n\n## Go的可见性规则\n```text\nGo语言中，使用`大小写`来决定该常量、变量、类型、接口、结构或函数 是否可以被外部包所调用：\n     根据约定，函数名首字母小写，即为private\n     函数名首字母大写，即为public\n```\n    \n## Go的基本类型\n- bool\n  - 长度:1字节\n  - 范围: true,false\n  -注意事项: 不可以用数字代表true或false\n- 整型: int/uint\n  - 根据运行平台可能为32或者64位\n- 8位整型: int8/uint8\n  - 长度: 1字节\n  - 取之范围: -128～127/0～255\n- 字节型: byte(uint8别名)\n- 16位整型：int16/uint16\n  - 长度：2字节\n  - 取值范围：-32768~32767/0~65535\n- 32位整型：int32（rune）/uint32\n  - 长度：4字节\n  - 取值范围：-2^32/2~2^32/2-1/0~2^32-1\n- 64位整型：int64/uint64\n  - 长度：8字节\n  - 取值范围：-2^64/2~2^64/2-1/0~2^64-1\n- 浮点型：float32/float64\n  - 长度：4/8字节\n  - 小数位：精确到7/15小数位\n- 复数：complex64/complex128\n  - 长度：8/16字节\n- 足够保存指针的 32 位或 64 位整数型：uintptr\n- 其它值类型：\n  - array、struct、string\n- 引用类型：\n  - slice、map、chan\n- 接口类型：inteface\n- 函数类型：func\n\n## 类型默认值（零值）\n```text\n  通常值类型默认值都为0，bool为false，string为空字符串\n```\n## 变量赋值与声明\n### 单个变量\n\n- 变量的声明格式：var \u003c变量名称\u003e \u003c变量类型\u003e\n- 变量的赋值格式：\u003c变量名称\u003e = \u003c表达式\u003e\n- 声明的同时赋值：var \u003c变量名称\u003e [变量类型] = \u003c表达式\u003e\n```go\n\tvar b uint32\n\tb=190\n\n\ta:=10\n\tvar c  =\"hello\"\n\tprintln(b,a,c)\n```\n\n### 多个变量\n- 全局变量的声明可使用 var() 的方式进行简写\n- 全局变量的声明不可以省略 var，但可使用并行方式\n- 所有变量都可以使用类型推断\n- 局部变量不可以使用 var() 的方式简写，只能使用并行方式\n\n```go\npackage main\n\n//变量赋值\n//全局变量赋值\nvar (\n\taaa     = \"hello\"\n\ta, b, c = 1, 2, 3\n)\n\nfunc assgin() {\n   //并行方式\n\tvar d, e, f int\n\td, e, f = 4, 5, 6\n\tvar h, j, k int = 10, 2, 4\n\tr,t:=1,32\n\tvar i, o  =10,20\n   //忽略赋值\n   var _,p,l=1,2,3\n    print(p,l)\n\n\tprintln(i,o)\n\tprintln(a, b, c, aaa)\n\tprintln(d, e, f)\n\tprintln(h, j, k)\n\tprintln(r,t)\n}\n\n```\n## Go的类型转换\n```text\nGo中不存在隐式转换，所有类型转换必须显式声明\n 转换只能发生在两种相互兼容的类型之间\n 类型转换的格式：\n \t\u003cValueA\u003e [:]= \u003cTypeOfValueA\u003e(\u003cValueB\u003e)\n```\n```go\nfunc typeCast()  {\n\tvar a float32=1000.1\n\tfmt.Println(a)\n\tb:=int(a);\n\tfmt.Println(b)\n}\n```\n## 常量\n### 常量的定义\n- 常量的值在编译时就已经确定\n- 常量的定义格式与变量基本相同\n- 等号右侧必须是常量或者常量表达式\n- 常量表达式中的函数必须是内置函数\n\n### 常量的初始化规则与枚举\n```text\n在定义常量组时，如果不提供初始值，则表示将使用上行的表达式\n使用相同的表达式不代表具有相同的值\niota是常量的计数器，从0开始，组中每定义1个常量自动递增1\n通过初始化规则与iota可以达到枚举的效果\n每遇到一个const关键字，iota就会重置为0\n\n```\n## 运算符\n- Go中的运算符均是从左到右结合\n**优先级(从高到低)**\n- `^` `!`                         (一元运算符)\n- `*` `/` `%` `\u003c\u003c` `\u003e\u003e` `\u0026` `\u0026^`  \n- `+` `-` `|` `^`                 (二元运算符)\n- `==` `!=` `\u003c` `\u003c=` `\u003e=` `\u003e`\n- `\u003c-`                            (专门用于channel)\n- `\u0026\u0026`\n- `||`\n\n## 指针\n```text\nGo虽然保留了指针，但与其它编程语言不同的是，在Go当中不\n支持指针运算以及”-\u003e”运算符，而直接采用”.”选择符来操作指针\n目标对象的成员\n\n操作符”\u0026”取变量地址，使用”*”通过指针间接访问目标对象\n默认值为 nil 而非 NULL\n\n\n递增递减语句\n\n        在Go当中，++ 与 -- 是作为语句而并不是作为表达式\n```\n\n```go\n//指针\nfunc cursor()  {\n\ta:=1\n\tvar p *int=\u0026a;\n\tprintln(*p)\n\ta++\n\tprintln(*p)\n}\n```\n## 控制语句\n### if\n- 条件表达式没有括号\n- 支持一个初始化表达式（可以是并行方式）\n- 左大括号必须和条件语句或else在同一行\n- 支持单行模式\n- 初始化语句中的变量为block级别，同时隐藏外部同名变量\n- 1.0.3版本中的编译器BUG\n```go\n//if语句\n\tif a := 1; a \u003e 1 {\n\t\tprintln(\"yes\")\n\t} else {\n\t\tprintln(\"no\")\n\t}\n```\n### for\n- Go只有for一个循环语句关键字，但支持3种形式\n- 初始化和步进表达式可以是多个值\n- 条件语句每次循环都会被重新检查，因此不建议在条件语句中\n- 使用函数，尽量提前计算好条件并以变量或常量代替\n- 左大括号必须和条件语句在同一行\n```go\n//for语句 类似于java\n\t//one\n\tfor i:=0;i\u003c10;i++  {\n\t\tprint(i)\n\t}\n\tprintln()\n\t//two 无限循环需要退出状态\n\ta:=1\n\tfor  {\n\t\ta++\n\t\tif a \u003e 10 {\n\t\t\tbreak\n\t\t}\n\t\tprint(a)\n\t}\n\tprintln()\n\t//three 类似于while(b\u003c10){b++}\n\tb:=1\n\tfor b\u003c10  {\n\t\tb++\n\t\tprint(b)\n\t}\n```\n\n### switch\n- 可以使用任何类型或表达式作为条件语句\n- 不需要写break，一旦条件符合自动终止\n- 如希望继续执行下一个case，需使用fallthrough语句\n- 支持一个初始化表达式（可以是并行方式），右侧需跟分号\n- 左大括号必须和条件语句在同一行\n```go\n//switch\n\t//one\n\tp:=1\n\tswitch p {\n\tcase 0:\n\t\tprintln(0)\n\tcase 1:\n\t\tprintln(1)\n\tdefault:\n\t\tprintln(\"default\")\n\t}\n\t//two\n\tz:=1\n\tswitch {\n\tcase z\u003e0:\n\t\tprintln(z)\n\tcase z\u003c0:\n\t\tprintln(\"-\" )\n\tdefault:\n\t\tprintln(\"not found\")\n\t}\n\t//three\n\tswitch z:=1; {\n\tcase a \u003e 0:\n\t\tprintln(z)\n\tcase a\u003c0:\n\t\tprintln(\"zzz\")\n\tdefault:\n\t\tprintln(\"not found\")\n\t}\n```\n### 跳转语句goto，break，continue\n- 三个语法都可以配合标签使用\n- 标签名区分大小写，若不使用会造成编译错误\n- break与continue配合标签可用于多层循环的跳出\n- goto是调整执行位置，与其他2个语句配合标签的结果并不相同\n\n```go\nLABEL:\n\tfor {\n\t\tfor i := 0; i \u003c 10; i++ {\n\t\t\tif i%2 == 0 {\n\t\t\t\tbreak LABEL\n\t\t\t} else {\n\t\t\t\tprintln(i)\n\t\t\t}\n\t\t}\n\t}\n\t// continue\nFlag:\n\tfor i := 0; i \u003c 3; i++ {\n\t\tfor {\n\t\t\tprintln(i)\n\t\t\tcontinue Flag\n\t\t}\n\t}\n\n\t//goto \n\tfor i := 0; i \u003c 3; i++ {\n\t\tfor {\n\t\t\tprintln(i)\n\t\t\tgoto L\n\t\t}\n\t}\nL:\n```\n## 数组array\n- 定义数组的格式：var \u003cvarName\u003e [n]\u003ctype\u003e，n\u003e=0\n- 数组长度也是类型的一部分，因此具有不同长度的数组为不同类型\n- 注意区分指向数组的指针和指针数组\n- 数组在Go中为值类型\n- 数组之间可以使用==或!=进行比较，但不可以使用\u003c或\u003e\n- 可以使用new来创建数组，此方法返回一个指向数组的指针\n- Go支持多维数组\n\n```go\n\npackage main\n\nimport \"fmt\"\n\n//数组学习\n\nfunc arrayDemo() {\n\t//长度不一致无法进行赋值，存在类型默认值\n\tvar a [2]int\n\tvar b [2]int\n\tb = a\n\tfmt.Println(b) //[0,0]\n\n\t//直接赋值\n\tarr := [2]int{1}\n\tprintln(arr[0])\n\n\t//索引方式,将索引为19的元素设置为1\n\tarr1 := [20]int{19: 1}\n\tfmt.Println(arr1)\n\n\t//自动计算长度\n\tarr2 := [...]int{1, 2, 3, 4}\n\tprintln(len(arr2))\n\n\t//去数组的指针 保存指针指向的值\n\tarr3 := [...]int{99: 1}\n\tvar p *[100]int = \u0026arr3\n\tprintln(p)\n\t//指针数组 保存两个指针的地址\n\tx, y := 1, 2\n\tarr4 := [...]*int{\u0026x, \u0026y}\n\tfmt.Println(arr4)\n\n\t//数组的表，需要类型一致,长度不同也无法进行比较\n\tvar arr5 [10]string\n\tvar arr6 [10]string\n\tprintln(arr5 == arr6)\n\n\t//多维数组\n\tarr7 := [2][3]int{\n\t\t{1, 1, 1},\n\t\t{2, 2, 2}}\n\tfmt.Print(len(arr7), len(arr7[0]), arr7)\n}\n\nfunc bubbleSort() {\n\tarr := [5]int{5, 3, 1, 7, 8}\n\tvar len = len(arr)\n\tfor i := 0; i \u003c len; i++ {\n\t\tfor j := i + 1; j \u003c len; j++ {\n\t\t\tif arr[i] \u003c arr[j] {\n\t\t\t\ttemp := arr[i]\n\t\t\t\tarr[i] = arr[j]\n\t\t\t\tarr[j] = temp\n\t\t\t}\n\t\t}\n\t}\n\tfmt.Println(arr)\n}\n\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcollabh%2Fgo-quick-start","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcollabh%2Fgo-quick-start","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcollabh%2Fgo-quick-start/lists"}