Java转Go学习——开始

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


前言

背景说明

最近决定学习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服务。用时一周比预估时间要短。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值