提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Java转Go学习——开始

前言一、第一阶段go语言基础速成学习经过:go与java的对比(个人思考)语法相对java要简洁特别多,但缺点在于如果书写的时候不人为进行规范就会乱七八糟的,比如:多个返回值并行任务的开启

并发文件处理器(统计目录下文件类型分布)

总结

前言

背景说明

最近决定学习go语言与前端基础,之前有过java的学习经验,程度大概就是应届生但找不到实习那种(手动滑稽),于是打开deepseek,开始制定学习计划,ok先明确学习目标8周时间,前6周学习go达成服务端开发的程度,后两周系统学习一下前端基础。

一、第一阶段go语言基础速成

学习经过:

两到三小时看完菜鸟教程go语言两倍速看B站IT营大地视频,跟着敲了go基础部分,GIN框架看了一部分,感觉这部分讲的比较粗糙得自己动手多写点就没看了 时间大概3天搜gin相关的项目想自己动手写写,于是找到了https://learnku.com/go 一个go的论坛,跟着https://learnku.com/articles/69259 这篇博客动手敲了一遍 用时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服务。用时一周比预估时间要短。