Go语言基本语法入门(一)| 豆包MarsCode AI 刷题

114 阅读5分钟

借助豆包 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 中使用

出处:

Go学习笔记

reference

《Go语言圣经》

tour.go-zh.org/

gopl-zh.github.io**/**