[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fuWwU1saWp-mafP6zwR4nbG3ifiTiMqLEyK6qGOholdc":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":28,"notice":28,"visitCount":29,"commentCount":30,"keywords":31},22,"2024-01-26T14:19:32.414Z","学习go的安装环境和基本配置还有基础知识","# 一、go安装和环境配置\n## 1. 安装\n方式一：软件包安装\n进入官网：https://go.dev/dl/，选择自己的电脑系统，下载软件包安装\n方式二： Mac电脑中使用brew\n```terminal\nbrew install go\n```\nwindows略\n\n## 2. 查看和配置环境\n```terminal\n// 查看go的环境配置变量，主要看GOPATH、GOROOT、GOBIN\ngo env\n\n// 如果不想使用默认的GOPATH配置路径，可自行设置GOPATH\ngo env -w GOPATH=xxxx  // xxxx为路径，比如/usr/local/go\n\n// GOBIN也需要设置一下，使用GOPATH路径下的bin目录即可\n```\n1. src // 这里面存放我们自己编写的go项目，往往以域名为文件夹名，然后以项目名作为二级文件夹名\n比如：src/baidu.com/baidu_cloud（baidu.com为域名，下面有一个baidu_cloud的工程项目）\n2. pkg // 见后面介绍\n3. bin // 见后面介绍\n\n## 3. 修改go镜像\n由于墙，国内推荐使用七牛云的镜像服务，查看其官网指南：https://goproxy.cn/\n![go镜像服务截图](https://image.xinwei.ltd/11706277776025.png)\n\n## 4. 代码编辑器IDE\n对于go，官方IDE是goland，可以到官网下载：[官网IDE下载](https://www.jetbrains.com/zh-cn/go/)\n我个人推荐使用vscode，在vscode中安装使用几个好用的扩展：\n![我推荐的开发go的vs插件](https://image.xinwei.ltd/21706277868160.png)\n\n# 二、go程序基本框架\n## 1. GOPATH解释\n1.src文件夹：存放源码；\n2.bin文件夹：存编译出的产物；\n3.pkg文件夹：存缓存的库。\n\n- 应该放在GOPATH指向的目录\n```terminal\n// 查看GOPATH指向的目录位置\ngo env | grep GOPATH\n```\n- 补充\nGOROOT：go编译源码根目录；\nGOPATH： go工程的根目录；GOPATH下应该要有src、bin、pkg这3个文件夹(没有的话可以新建这几个文件夹)，编写的工程代码需放在src中，比如go项目工程go_test，目录应该如: $GOPATH/src/go_test。\nGOBIN:  go工程的bin目录，存放二进制可执行文件；\n\n- 每一个go文件，都以go为扩展名；\n- go文件中都有一个包名，作为命名空间：\n```test.go\npacakage main\n\nfunc main() {\n    \n}\n```\n\n## 2. 代码工程 & mod\n1. 程序的入口文件都是main.go\n2. 然后可以新建其他的文件夹，比如controller、model、services、utils等\n3. 初始化mod，mod中有我们自己项目中所需引入的库，类似于依赖配置文件。\n打开命令行终端，进入在main.go同级目录，执行以下命令：\n```terminal\ngo mod init baidu_cloud //这里以baidu_cloud为工程名字作为示例\n```\n4. 生成mod文件后，之后基本不用管mod\n\n## 3. 引入包\n```xxx.go\nimport \"fmt\" // 在go文件中引入标准库\n```\n当需要引入其他框架时，比如gorm框架，需要在项目根目录，即mod所在目录下，执行终端命令：\n```terminal\ngo get -u gorm.io/gorm\n```\n执行命令成功后，mod文件中会自动引入这个库版本等信息，工程中就可以直接引用使用。\n其他go框架，参照其对应的github使用方式即可。\n\n## 4. go常用命令\n```terminal\ngo run xxx.go // 编译运行某个文件\n\ngo run *.go // 所有go文件\n\ngo build -o xxx.exe xxx.go // 编译成windows上的程序\n\ngo env // 查看go的环境配置信息\n\ngo env -w GOPATH=/usr/local/go // 修改env中某个配置变量的值，这里以GOPATH为示例\n\n```\n\n# 三、基本语法\n1. 变量声明：\n```xxx.go\n// 自动类型推断\nname := \"自动类型推断，所有语句不需要分号结尾\"\nage := 14\n\nlist := [10]int{1, 2, 3}; // 固定长度数组\narr  := []int{}; // 可变长度数组\n\n// 先声明，后赋值\nvar nickname: string\nnickname = \"可以声明了再赋值\"\n\n// 声明多个并赋值\nname, age := \"姓名\", 14\n\n// 可以不用加小括号\n// 大括号的 { 要紧跟在代码行右侧，再换行写大括号中的代码\ncon := 4\nif con > 3 {\n    fmt.println(\"true\")\n}\n\n// 数字变量，只有后置运算符，没有c语言中的前置运算符\niterator := 1 // 声明了一个1\niterator++ // 这行必须单独一行，不能放在if或者其他代码行中\n++iterator // 会报错\n```\n\n2. 数组\n```xxx.go\nlist := []str{\"元素1\", \"元素2\"}\n\n// 获取数组长度\nfmt.printf(\"数组长度：%d\", len(list))\n\n// 第一种常规循环\nfor i:=0; i\u003Clen(); i++ {\n    \n}\n\n// 第二种循环 for - range\nfor key, value := range list {\n    fmt.printf(\"数组长度：%c\", key, \", 值是：%c\", value)\n}\n\n// 如果要忽略其中某一个值，使用_下划线代替即可\nfor _, value := range list {\n    fmt.printf(\"值是：%c\", value)\n}\n\n```\n\n3. 数组的length和capacity（长度len和容量cap）\n```xxx.go\nlist := []int{1, 2}\n\nprintln(\"长度是:\", len(list)) // 2\nprintln(\"容量是:\", cap(list)) // 2\n\n// 数组添加\nlist = append(list, [3, 4, 5])\n\nfmt.println(\"长度是:\", len(list)) // 4\nfmt.println(\"容量是:\", cap(list)) // 8\n```\n当数组新增加的数量，超过初始容量时，可变数组的容量会增加为初始容量的2倍，当容量越来越大时，可能到不了2倍\n\n4. 数组切片\n```xxx.go\nlist := []int{1, 2, 3, 4}\n\nsliceList = list[0:2] // 取list的第0位到第2位的元素，半闭合数组 0\u003C= slice \u003C2\n\nsliceList2 = list[:4] // 默认为 0 \u003C= ... \u003C4\n\nsliceList2 = list[2:] // 默认为 2 \u003C= ... \n\n// warning：当修改切片中的某一个数据时，会影响到原数组。\n// 想要切片独立于原数组，那么需要使用copy函数\n\nwelString := \"hello world\"[6:]\nfor i:=0; i\u003Clen(welString); i++ {\n    \n}\n```\ncopy操作:\n```xxx.go\nlist := []int{1, 2, 3, 4}\n\nlist_copy := make([]int, len(list))\n\ncopy(list_copy, list[:]) // 表示把list全长的切片，拷贝到list_copy，\n// 因为copy函数第二位要求是切片类型\n```\nmake创建指定length和capacity的切片:\n```xxx.go\nstr := make([]string, 10, 15) // 创建一个默认长度为10，容量为15的切片, \n// 15所代表的第3个形参不是必须填写的，如果没写cap，默认和len一样\n```\n\n5. 函数声明\n```xxx.go\n// 不带返回值\nfunc main() {\n    \n}\n\n// 带返回值\nfunc doSomething() string {\n    return \"返回值是xxxxx\"\n}\n```\n\n6. 指针\n```xxx.go\n// 指针操作\nname := \"Li lei\"\nnamePtr = &name\n\nfmt.println(\"指针指向的内容是：\", *namePtr)\n\n// 不同于c语言，go还可以取到栈空间的指针\nfunc test() *int {\n    num := 1\n    return &num // 一般情况下，程序执行完毕，栈空间中的变量会被释放掉，\n    // 但是go会判断如果是需要使用到的栈变量，会把变量存到堆上\n}\n\nfmt.println(\"指针的内容是：\", *test()) // 1\n\n```\n\n7. map字典\n```xxx.go\n// 推断式声明 - 推荐使用\ndict := make(map(int)string)\n// 或者\ndict := make(map(int)string, 10) // 给定长度\n\n// 先声明，再赋值\nvar dict map(int)string\ndict = make(map(int)string)\n\n// 赋值\ndict[0] = \"first\"\ndict[1] = \"second\"\n\n// 读取\nfmt.println(\"值是：\", dict[0]) // first\nfmt.println(\"超过容量的值是：\", dict[100]) // 空，当读取的key不在容量内时，返回空，不报错\n\n// 循环\nfor key, value := range dict {\n    fmt.println(\"key是：\", key, \", value是：\", value)\n}\n\n// 判断map中是否有这个key存在（由于读取不存在的key也不报错）\nvalue, ok := dict[0]\nif ok {\n    fmt.println(\"value是：\", value) // first\n} else {\n    fmt.println(\"value是：\", value) // 空\n}\n\n// 删除某一个值\ndelete(dict, 0)\ndelete(dict, 100) // 删除不存在的，也不会报错\nfmt.Println(\"删除后：\", dict) // map[1 : second]\n\n// 并发任务处理的时候，需要对map上锁\n```\n\n","这里告诉大家如何安装golang的开发环境，包含对环境目录的解释，编辑器和好用的插件，以及还有一些语法及代码使用的基本知识。介绍了变量、切片、函数、指针、map等概念和基本使用。","https://image.xinwei.ltd/11706277776025.png",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",16,{"id":24,"name":26,"parentId":21},"Golang",[],"",76,0,"golang,mac golang"]