借助豆包 MarsCode AI 刷题助力 Go 语言学习
在 Go 语言学习的旅程中,豆包 MarsCode AI 刷新了以往我学习编程语言观念
字节内部课程知识讲解深入浅出,面对 Go 复杂特性,像并发编程里的协程与通道,起初概念似一团迷雾。向 AI 求助,它先以通俗比喻阐述原理,将协程类比工厂多条流水线并行作业,通道则是流水线间传递 “货物” 的传送带,助我把握基础。接着结合代码实例详述细节,展示如何精准创建、调度协程及高效利用通道通信,让抽象知识具象化。
代码纠错高效实用。刷题时语法或逻辑出错,AI 迅速定位,曾因疏忽在函数闭包中误改外部变量致结果偏差,AI 点明 Go 变量作用域规则,给出修正思路,还附优化建议提升性能。
智能出题更是一绝,依我薄弱点生成 Go 接口使用、切片操作难题,在 “练中学” 里稳步攻克知识短板,实现能力进阶。
用 Go 语言编程,难题不少。像怎么妥善存储、操作数据,如何组织代码实现功能,还有怎样发挥其并发优势,让程序高效运行。靠着刷题,还有豆包 MarsCode AI 帮忙,我慢慢解开疑惑,挖到知识宝藏。现在,把总结的 Go 语言基础知识第一期分享出来,希望能给大家指指路。
语法
Hello World
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println("Welcome to the playground!")
fmt.Println("The time is", time.Now())
}
Welcome to the playground!
The time is 2024-11-28 23:00:00 +0000 UTC m=+0.000000001
包
每个Go程序都是由包构成的。
程序从 main 包开始运行。
通过import 导入 fmt和time两个包。()代表分组导入形式,也可以分别导入:
import "fmt"
import "time"
包可以有路径 如 math/rand,源码实现已最后一个名字作为包名。即 package rand。
fmt.Println("The time is %s now", time.Now())
导出名:
变量或方法以大写开头则为导出值,外部可用,如Println。否则报未定义错误
./prog.go:9:19: undefined: math.pi
函数
函数变量类型在变量后(参考 这篇关于 Go 语法声明的文章了解这种类型声明形式出现的原因。)
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
fmt.Println(add(42, 13))
}
当连续两个或多个函数的已命名形参类型相同时,除最后一个类型以外,其它都可以省略。
func add(x, y int) int {
return x + y
}
返回值可是任意个数。
package main
import "fmt"
func swap(x, y string) (string, string) {
return y, x
}
func main() {
a, b := swap("hello", "world")
fmt.Println(a, b)
}
返回值可被定义名字,被视作函数开头声明了该返回变量。尽量用在较短的函数,若函数太长,返回值写在return更容易阅读。写在返回列表中的好处是,容易生成文档。
package main
import "fmt"
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
func main() {
fmt.Println(split(17))
}
变量
var 用于声明变量列表,同一种类型可以用逗号分隔写在一行。
package main
import "fmt"
var c int
var python, java bool
func main() {
var i int
fmt.Println(i, c, python, java)
}
0 0 false false
变量可以出现在包级别,也可以出现在函数级别。是动态类型,运行时确定类型。
变量声明时可以同时赋值,不同类型赋值可在同一行用一个等号分别对应赋值,不能空缺。
package main
import "fmt"
var i, j int = 1, 2 // int 可以不要。如果初始化值已存在,则可以省略类型;变量会从初始值中获得类型。
func main() {
var c, python, java = true, false, "no!"
fmt.Println(i, j, c, python, java)
}
短变量声明
在函数中,简洁赋值语句 := 可在类型明确的地方代替 var 声明。
函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。
k := 3
基本类型
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名
// 表示一个 Unicode 码点
float32 float64
complex64 complex128
本例展示了几种类型的变量。 同导入语句一样,变量声明也可以“分组”成一个语法块。
int, uint 和 uintptr 在 32 位系统上通常为 32 位宽,在 64 位系统上则为 64 位宽。 当你需要一个整数值时应使用 int 类型,除非你有特殊的理由使用固定大小或无符号的整数类型。
package main
import (
"fmt"
"math/cmplx"
)
var (
ToBe bool = false
MaxInt uint64 = 1<<64 - 1
z complex128 = cmplx.Sqrt(-5 + 12i)
)
func main() {
fmt.Printf("Type: %T Value: %v\n", ToBe, ToBe)
fmt.Printf("Type: %T Value: %v\n", MaxInt, MaxInt)
fmt.Printf("Type: %T Value: %v\n", z, z)
}
表达式 T(v) 将值 v 转换为类型 T。不同类型的变量都需要显示转换。
var i int = 42
var f float64 = float64(i)
var u uint = uint(f)
或者,更加简单的形式:
i := 42
f := float64(i)
u := uint(f)
类型推导,根据右值推导左值类型。
常量使用 const 关键字,不能用 := 语法声明。
const World = "世界"
const Pi = 3.14
数值常量是一个高精度的值,最高可用64位浮点数存储。
零值
未初始化变量的值,同C。
数值类型为 0, 布尔类型为 false, 字符串为 ""(空字符串)。
转移字符
%T :变量类型
%v:数值大小
%q:字符串
%g:浮点数
%c: 时间类型
fmt.Printf 中使用