Go语言学习笔记(一)- 路由、参数、JSON 响应
今天开始学习Go Web,目前主流的框架有gin、go-zero、echo等。我还是随主流,选择gin。 今天要学习的知识点是: 启动Gin服务 定义Get / POST / PUT / DELETE / 路由 获取路径参数 获取query参数 返回JSON响应 路由分组 创建一个gin项目初始化项目123456# 创建项目目录mkdir gowebcd goweb# 初始化go modego mod init dev.net.cn/goweb 执行完成后,会生成一个go.mod文件,用来管理项目的依赖和版本。 配置代理为了更快的下载Go的模块,这里推荐大陆用户配置代理 12345# 如果是 Linux / macOSexport GOPROXY=https://goproxy.cn,direct# 如果是 Windows (PowerShell)$env:GOPROXY="https://goproxy.cn,direct" 下载gin依赖1go get -u github.com/gin-gonic/gi...
VS Code无法登录微软账号
现象在VS Code中,点击账户->登录以同步设置后,弹出的登陆界面提示404,右下角错误信息为:no_network_connectivity: No network connectivity. Check your internet connection.。如下图所示: 在mac/linux上这个功能是可用的。 解决方案其根本原因是Clash Verge在作祟,但也不能每次都关闭,还要查到具体的原因。后来通过多方搜索,找到了原因: 登录调用的是工作或学校账户的UWP应用,默认无法使用本地回环地址的代理 所以,需要借助Clash Verge自带的UWP 工具,在设置 -> Clash设置 -> UWP 工具。打开后,勾选列表中的工作或学校账户。 点击Save Changes后,再次尝试登录,就可以正常登录了。
Go语言学习笔记(八)- 标准库
文件操作:os、io、bufioGo语言中,文件操作主要分三层 os : 直接和操作系统交互,比如打开文件、删除文件、创建文件、读写文件等。 io :抽象I/O行为,比如:io.Reader、io.Writer、io.Copy bufio : 带缓冲的读写,适合按行读取、大文件处理、减少系统调用。 os.ReadFile一次性读取整个文件,适合读取小文件,例如配置文件、模板文件、JSON文件。 12345678func TestOsReadFile(t *testing.T) { data, err := os.ReadFile("d:/a.txt") if err != nil { t.Error(err) } fmt.Println(string(data))} 注意:不要用它读取特别大的文件,因为会一次性把整个文件加载到内存。 os.WriteFile一次性写入文件 123456789101112func TestOsWriteFile(t *testing.T) { data ...
Go语言学习笔记(七)- 错误处理与包管理
error 接口与 errors 包Go语言的错误,不像Java/Python那样默认靠异常传播机制,而是一个普通返回值。Go内置的error类型本质上是一个接口。只要求实现一个方法Error() string;nil通常表示没有错误。 123type error interface { Error() string} 在Go代码里最常见的模板就是: 1234result,err := doSomething()if err !=nil{ return err} 这种模式,就相当于Java的try/catch。 创建简单错误errors.New(text)会创建一个只包含文本信息的error;每次调用errors.New都返回一个不同的error的值,即使文本相同。 123456789101112131415func divide(a, b int) (int, error) { if b == 0 { return 0, errors.New("division by zero&q...
Go语言学习笔记(六)- 并发编程
今天开始学习Go语言的重要特性,Goroutine。 goroutineGoroutine,通常称之为协程,区别于Java的线程,它是由Go runtime调度,启动成本很低,初始栈很小,并且可以按需增长。多个goroutine在同一个进程地址空间内并发执行。 先看看Java的线程: 1new Thread(() -> {System.out.println("Hello Java");}).start(); 在看看看Go的goroutine: 123go func() { fmt.Println("Hello Go")}() 启动普通函数12345678910111213141516171819202122232425262728import ( "fmt" "sync" "testing")func PrintName(name string) { fmt.Println(name)}func Te...
Go语言学习笔记(五)- 接口与类型系统
接口在Go语言中,接口的设计是一个典型的“鸭子类型”(Duck Typing)。如果一个结构体拥有了某个接口定义的所有方法,那么它就实现了这个接口。 先看看Java的接口(显示实现接口) 123456789interface Animal{ void say();}class Dog implements Animal { public void say(){ System.out.println("wang!") }} 类必须通过implements关键字明确申明自己实现了某个接口。 再看看Go的接口 123456789type Animal interface { Say();}type Dog struct{}func (d Dog) Say(){ fmt.Println("wang!")} Go是隐式实现接口,只要一个类型实现了接口需求的所有方法,就自动认为他实现...
Go语言学习笔记(四)- 控制流与函数
今天简单的学习下流程控制与函数,这一块大多数语言都差不多。 if/elseGo语言的if不需要小括号,但代码块必须使用{}包裹。 12345678func TestIf(t *testing.T) { age := 30 if age >= 18 { t.Log("adult") } else { t.Log("teenager") }} 其次,if条件必须是bool,不支持将整数、字符串、指针等作为条件。 Go 不像 C / C++ / JavaScript,不能用 0、1、nil 等隐式转 bool。 1234567func TestIf1(t *testing.T) { n := 1 //非布尔值 'n' (类型 int) 用作条件 if n { t.Log("error") }} if支持初始化语句这是 Go 很常见的...
Go语言学习笔记(三)- 复合数据类型
本章知识点: 数组与切片 map(字典) struct(结构体) 指针 泛型 数组与切片在 Go 中,数组是固定长度的,而切片是动态的、是对数组的抽象。 数组不管在Java还是Go似乎都不太常用,比较常用List或者Go中的切片。其语法如下: 1234567891011121314151617181920212223242526272829package mainimport "testing"func Test_Array(t *testing.T) { // 数组时值类型,当一个数组被赋值给另一个数组时,实际上是创建了一个新的数组,并将原数组的值复制到新数组中。这意味着对新数组的修改不会影响原数组,反之亦然。 // 定义一个长度为5的int数组,其默认值为0 var arr1 [5]int t.Log(arr1) // 定义一个长度为3的字符串数组,默认值为"" var arr2 [3]string t.Log(arr2) // 初始化 //字面量初始化 arr3 := [3]string{"a...
Go语言学习笔记(二)- 基础语法与数据类型
作为Java程序员,本章内容就走马观花的了解一下即可,这一章内容和其他语言没有太大的不同。 本章学习的内容 包申明、导入、main方法 变量声明(var和:=的区别) 基本类型:int、float、string、bool 常量与iota 类型转换 main方法通过一个HelloWorld的程序,说明第一小节内容:包申明、导入包、main方法。创建一个main.go 1234567package mainimport "fmt"func main() { fmt.Print("Hello World")} 包申明: 1package main 在Go语言中,每一个源文件都必须以package开头,它的作用就是定义了该文件属于哪个命名空间。这个名称可以随意定义,但main这个名称很特殊: 如果该文件的package是main,那么这个程序将会被编译成一个可执行程序。 对于不同的文件,也可以将包名定义为main,但是main方法只能有一个。 例如在main.go的同一级目录,创建一个utils.go,并且也声明为...
Go语言学习笔记(一)- 环境配置
前言2017年,简单的学习了一下Go语言,但苦于当时的工作没有办法实践,而我又刚换了工作,每天都要加班到最后一班地铁,没多久,学习的内容就基本上忘光光了,今年得空,可以在学习下Go语言,手头上也有两个项目有时间去重构,那就重新学习一次吧。本次学习使用go 1.26版本。 Go语言介绍Go语言由Google开发,对于程序开发效率、并发、云原生等有非常好的支持。对于Java程序员来说,学习起来非常容易。 核心特性:天然并发(Goroutine)、强类型、编译速度极快、垃圾回收(GC)、静态链接成单个可执行二进制文件。 适用场景:云原生开发(Docker/K8s 均由 Go 编写)、微服务、系统工具、高性能网络服务。 GOROOT和GOPATH对于Go新手还是有必要明确下这两个环境变量的含义,不然很容易纯靠字面意思搞错。 GOROOT,就是Go SDK的安装路径,不是go语言的项目路径,对于Java程序员来说,就是JDK的路径。 GOPATH,工作区路径,类似于Eclipse+maven的组合,将workspace和.m2合并在一个目录。最开始用起来老别扭了,不过从Go ...

