第一课 走进 Go 语言基础语法|豆包MarsCode AI刷题

57 阅读4分钟

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的接口设计非常智能,不需要显式声明实现了哪个接口,只要实现了接口中的所有方法就算实现了这个接口。这种"鸭子类型"的设计让代码更灵活,也更容易测试。

遇到的挑战

学习过程中也遇到了不少困难:

  1. 包管理起初很困惑,不太理解go.mod文件的作用
  2. 指针的概念需要时间适应,特别是在结构体方法中使用指针接收者
  3. 并发编程中的死锁问题让我调试了好久

心得体会

经过这段时间的学习,我感觉Go是一门很适合入门的语言:

  • 语法简单清晰,不需要记忆太多规则
  • 标准库功能丰富,很多常用功能都不需要依赖第三方包
  • 编译器的错误提示很友好,对初学者很有帮助
  • 性能优秀,编译速度快,运行效率高

未来计划

接下来,我打算:

  1. 深入学习Go的并发模式
  2. 尝试用Go写一个小型Web服务
  3. 学习如何进行单元测试
  4. 阅读一些开源项目的代码,学习最佳实践

总的来说,Go语言给我的感觉就像是一把"瑞士军刀",既简单实用,又功能强大。作为初学者,我很庆幸选择了Go作为学习的编程语言之一。虽然道路还很长,但我对未来的学习充满期待!