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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!