Java转Go学习——开始
前言
背景说明
最近决定学习go语言与前端基础,之前有过java的学习经验,程度大概就是应届生但找不到实习那种(手动滑稽),于是打开deepseek,开始制定学习计划,ok先明确学习目标8周时间,前6周学习go达成服务端开发的程度,后两周系统学习一下前端基础。
一、第一阶段go语言基础速成
学习经过:
- 两到三小时看完菜鸟教程go语言
- 两倍速看B站IT营大地视频,跟着敲了go基础部分,GIN框架看了一部分,感觉这部分讲的比较粗糙得自己动手多写点就没看了 时间大概3天
- 搜gin相关的项目想自己动手写写,于是找到了learnku.com/go 一个go的论坛,跟着博客:GoWeb框架Gin学习总结 这篇博客动手敲了一遍 用时1天
- leetcode100道热题 每天刷点进入学习状态
- 通过豆包了解了一下视频和文档里面没提到的go的依赖管理(GOPATH 已淘汰,go mod),调试工具(dlv、IDE集成),内存管理
- 借助豆包对所学基础内容进行梳理
- 编写了一个并发文件处理器(统计目录下文件类型分布)来加深对并发和文件操作的认识
go与java的对比(个人思考)
语法相对java要简洁特别多,但缺点在于如果书写的时候不人为进行规范就会乱七八糟的,比如:
- 变量的声明
- 两个值的交换
- 切片以及字符串的操作
- 接口的实现只要有接口对应方法即可,不用显示声明
- 通过结构体嵌入的方式实现继承
- 异步任务的开启
多个返回值
- 结合for range还挺好用的
- 还有map的判断上也很方便
并行任务的开启
通过go可以很简单的开启一个协程,内存占用远小于java的线程,而且用户态和内存态的切换开销更小,效率更高。通过管道channel进行数据交换而不是java中的锁和共享内存,更快更轻量
并发文件处理器(统计目录下文件类型分布)
package main
import (
"fmt"
"os"
"path/filepath"
"sync"
)
func countFileTypes(root string) map[string]int {
fileType := make(map[string]int) // 创建一个map记录文件类型和文件数量
var wg sync.WaitGroup // 用来等待所有goroutine执行完毕
typeCountChannal := make(chan string) // 创建一个channel用来传递文件类型
// 遍历目录的函数
walkDir := func(path string, info os.FileInfo, err error) error {
// 处理错误
if err != nil {
return err
}
// 如果不是目录
if !info.IsDir() {
//开启一个goroutine
wg.Add(1)
go func(p string) {
defer wg.Done()
// 获取文件扩展名
ext := filepath.Ext(p)
if ext != "" {
// 将文件扩展名发送到channel
typeCountChannal <- ext[1:]
}
}(path) // 这里相当于直接声明一个匿名函数,然后调用这个匿名函数传入参数path文件路径
}
return nil
}
// 启动goroutine遍历目录
go func() {
// 递归遍历目录并执行walkDir函数处理文件
err := filepath.Walk(root, walkDir)
if err != nil {
fmt.Println("遍历目录出错:", err)
}
// 等待所有goroutine执行完毕,然后关闭channel
wg.Wait()
close(typeCountChannal)
}()
// 接收channel中的文件类型并更新fileType
for ext := range typeCountChannal {
fileType[ext]++
}
return fileType
}
func main() {
// 检查参数
if len(os.Args) < 2 {
fmt.Println("请提供要统计的目录路径作为参数。")
return
}
// 设置要统计的目录路径
root := os.Args[1]
// 统计文件类型
fileTypes := countFileTypes(root)
// 输出统计结果
fmt.Println("文件类型分布统计:")
for ext, count := range fileTypes {
fmt.Printf("%s: %d\n", ext, count)
}
}
总结
第一阶段任务目标基本完成,完成了对go基础语法的学习,通过gin框架实现了简单的http api服务。用时一周比预估时间要短。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: