Go语言学习笔记 - 从零开始的编程之旅
前言
作为一个刚接触Go语言的初学者,这两周的学习让我对这门语言有了全新的认识。相比我之前学习的Python和JavaScript,Go给我的第一印象就是:简洁而强大。
初见Go语言
记得第一天学习Go时,被它的语法风格小小震惊了一下。没有Python那样的缩进要求,也不需要像JavaScript那样到处写分号,而是采用了大括号来划分代码块。最让我印象深刻的是变量声明,Go提供了两种方式:
var name string = "taka" // 标准声明
name := "taka" // 短变量声明
起初我还在想:为什么要有两种声明方式呢?后来在实践中发现,短变量声明(:=)确实让代码更简洁,尤其是在函数内部使用时。不过有一点需要注意,它只能在函数内部使用,这个"坑"我已经踩过好几次了。
令人困惑的切片
数组在其他语言中都很简单,但Go的切片却让我开始时很困惑。它看起来像数组,但又不完全是:
arr := [3]int{1, 2, 3} // 数组
slice := []int{1, 2, 3} // 切片
通过查阅资料和反复实践,我终于理解了:切片实际上是对数组的引用,就像一个"窗口",通过它可以看到底层数组的某个部分。这个概念对我来说特别新颖,因为在Python中的列表(list)就是一个独立的数据结构。
并发编程的惊喜
学习到goroutine和channel时,我感觉打开了新世界的大门。在其他语言中,并发编程往往很复杂,需要处理各种锁和同步问题。但Go把它变得如此简单:
go func() {
fmt.Println("并发执行")
}()
只需要一个go关键字,就能创建一个并发任务!这真的太神奇了。不过,我也在实践中发现,虽然创建goroutine很容易,但正确地协调它们却需要不少功夫。channel(通道)的概念一开始让我有点懵,后来我把它理解为"管道",两个goroutine之间通过这个管道传递数据,就清晰多了。
令人舒适的错误处理
Go的错误处理方式最初让我觉得很啰嗦:
result, err := someFunction()
if err != nil {
// 处理错误
}
几乎每个函数调用后都要检查错误,但用着用着,我反而爱上了这种显式的错误处理方式。它让代码的错误处理变得很清晰,不会像try-catch那样容易忽略某些错误情况。
接口的妙用
Go的接口设计非常智能,不需要显式声明实现了哪个接口,只要实现了接口中的所有方法就算实现了这个接口。这种"鸭子类型"的设计让代码更灵活,也更容易测试。
遇到的挑战
学习过程中也遇到了不少困难:
- 包管理起初很困惑,不太理解go.mod文件的作用
- 指针的概念需要时间适应,特别是在结构体方法中使用指针接收者
- 并发编程中的死锁问题让我调试了好久
心得体会
经过这段时间的学习,我感觉Go是一门很适合入门的语言:
- 语法简单清晰,不需要记忆太多规则
- 标准库功能丰富,很多常用功能都不需要依赖第三方包
- 编译器的错误提示很友好,对初学者很有帮助
- 性能优秀,编译速度快,运行效率高
未来计划
接下来,我打算:
- 深入学习Go的并发模式
- 尝试用Go写一个小型Web服务
- 学习如何进行单元测试
- 阅读一些开源项目的代码,学习最佳实践
总的来说,Go语言给我的感觉就像是一把"瑞士军刀",既简单实用,又功能强大。作为初学者,我很庆幸选择了Go作为学习的编程语言之一。虽然道路还很长,但我对未来的学习充满期待!