// 包声明
package main
// 导入包
import "fmt"
// 主函数
func main() {
fmt.Println("Hello, World!")
}
package main
import "fmt"
func main() {
// 数值类型
var i int = 42
var f float64 = 3.14
var b bool = true
var s string = "Go语言"
fmt.Printf("int: %d, float64: %f, bool: %t, string: %s\n", i, f, b, s)
// 类型转换
var x int = 10
var y float64 = float64(x)
fmt.Printf("x: %d, y: %f\n", x, y)
}
package main
import "fmt"
func main() {
// 数组(固定长度)
var arr [5]int = [5]int{1, 2, 3, 4, 5}
fmt.Println("数组:", arr)
// 切片(动态长度)
var slice []int = []int{1, 2, 3}
slice = append(slice, 4) // 添加元素
fmt.Println("切片:", slice)
// 映射(键值对)
var m map[string]int = make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println("映射:", m)
}
package main
import "fmt"
func main() {
// 变量声明
var name string = "Go"
var age = 25
score := 95.5
fmt.Printf("name: %s, age: %d, score: %f\n", name, age, score)
// 常量
const PI = 3.14159
const (
StatusOK = 200
StatusNotFound = 404
)
fmt.Printf("PI: %f, StatusOK: %d, StatusNotFound: %d\n", PI, StatusOK, StatusNotFound)
}
package main
import "fmt"
func main() {
// if/else
age := 20
if age >= 18 {
fmt.Println("成年人")
} else {
fmt.Println("未成年人")
}
// if with initialization
if num := 10; num%2 == 0 {
fmt.Println(num, "是偶数")
}
}
package main
import "fmt"
func main() {
// 基本for循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// 类似while的for循环
sum := 1
for sum < 100 {
sum += sum
fmt.Println("sum:", sum)
}
// 无限循环(带退出条件)
count := 0
for {
count++
if count >= 3 {
break
}
fmt.Println("无限循环:", count)
}
// 遍历切片
slice := []string{"a", "b", "c"}
for index, value := range slice {
fmt.Println(index, value)
}
}
package main
import (
"fmt"
"runtime"
)
func main() {
// 基本switch
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("macOS")
case "linux":
fmt.Println("Linux")
case "windows":
fmt.Println("Windows")
default:
fmt.Printf("%s.\n", os)
}
// 无表达式的switch(类似if/else链)
hour := 14
switch {
case hour < 12:
fmt.Println("上午")
case hour < 18:
fmt.Println("下午")
default:
fmt.Println("晚上")
}
}
package main
import "fmt"
func main() {
// defer按照后进先出(LIFO)顺序执行
defer fmt.Println("世界")
defer fmt.Println("你好")
fmt.Println("开始")
// 输出顺序:开始、你好、世界
}
package main
import "fmt"
// 基本函数
func add(x, y int) int {
return x + y
}
// 多返回值
func swap(x, y string) (string, string) {
return y, x
}
// 命名返回值
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return // 直接返回命名的变量
}
func main() {
// 测试基本函数
result := add(3, 5)
fmt.Println("3 + 5 =", result)
// 测试多返回值
a, b := swap("hello", "world")
fmt.Println("交换后:", a, b)
// 测试命名返回值
x, y := split(17)
fmt.Println("分割结果:", x, y)
}
package main
import "fmt"
func sum(nums ...int) int {
total := 0
for _, num := range nums {
total += num
}
return total
}
func main() {
// 调用
fmt.Println(sum(1, 2)) // 3
fmt.Println(sum(1, 2, 3)) // 6
fmt.Println(sum(1, 2, 3, 4, 5)) // 15
}
package main
import "fmt"
// 闭包函数
func adder() func(int) int {
sum := 0
return func(x int) int {
sum += x
return sum
}
}
func main() {
// 使用
pos, neg := adder(), adder()
for i := 0; i < 5; i++ {
fmt.Println(
pos(i), // 0 1 3 6 10...
neg(-2*i), // 0 -2 -6 -12 -20...
)
}
}
package main
import "fmt"
// 阶乘计算
func factorial(n int) int {
if n == 0 {
return 1
}
return n * factorial(n-1)
}
// 斐波那契数列
func fib(n int) int {
if n < 2 {
return n
}
return fib(n-1) + fib(n-2)
}
func main() {
// 测试阶乘
fmt.Println("5! =", factorial(5))
// 测试斐波那契数列
for i := 0; i < 10; i++ {
fmt.Printf("fib(%d) = %d\n", i, fib(i))
}
}
package main
import (
"fmt"
"strconv"
"strings"
)
// 实现加减乘除运算
func calculator(a, b float64, operator string) (float64, error) {
switch operator {
case "+":
return a + b, nil
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
if b == 0 {
return 0, fmt.Errorf("除数不能为零")
}
return a / b, nil
default:
return 0, fmt.Errorf("不支持的运算符: %s", operator)
}
}
// 扩展功能:支持表达式解析
func evaluateExpression(expr string) (float64, error) {
// 简单实现:只支持两个数的运算
expr = strings.ReplaceAll(expr, " ", "")
// 查找运算符
var operator string
var index int
for i, c := range expr {
if c == '+' || c == '-' || c == '*' || c == '/' {
operator = string(c)
index = i
break
}
}
if operator == "" {
return 0, fmt.Errorf("无效的表达式")
}
// 提取两个数字
num1Str := expr[:index]
num2Str := expr[index+1:]
num1, err := strconv.ParseFloat(num1Str, 64)
if err != nil {
return 0, fmt.Errorf("无效的数字: %s", num1Str)
}
num2, err := strconv.ParseFloat(num2Str, 64)
if err != nil {
return 0, fmt.Errorf("无效的数字: %s", num2Str)
}
return calculator(num1, num2, operator)
}
func main() {
// 测试基本计算
result, err := calculator(10, 5, "+")
if err != nil {
fmt.Println("错误:", err)
} else {
fmt.Println("10 + 5 =", result)
}
// 测试表达式解析
expr := "3.5 * 2"
result, err = evaluateExpression(expr)
if err != nil {
fmt.Println("错误:", err)
} else {
fmt.Printf("%s = %.2f\n", expr, result)
}
}
package main
import (
"fmt"
"strings"
)
// 摄氏温度与华氏温度转换
func celsiusToFahrenheit(c float64) float64 {
return c*9/5 + 32
}
func fahrenheitToCelsius(f float64) float64 {
return (f - 32) * 5 / 9
}
// 摄氏温度与开尔文温度转换
func celsiusToKelvin(c float64) float64 {
return c + 273.15
}
func kelvinToCelsius(k float64) float64 {
return k - 273.15
}
// 扩展:支持多种温度单位转换
type Temperature struct {
Value float64
Unit string // "C", "F", "K"
}
func ConvertTemperature(temp Temperature, targetUnit string) (Temperature, error) {
// 先转换为摄氏温度
var celsius float64
switch strings.ToUpper(temp.Unit) {
case "C":
celsius = temp.Value
case "F":
celsius = fahrenheitToCelsius(temp.Value)
case "K":
celsius = kelvinToCelsius(temp.Value)
default:
return Temperature{}, fmt.Errorf("不支持的温度单位: %s", temp.Unit)
}
// 从摄氏温度转换为目标单位
var result float64
switch strings.ToUpper(targetUnit) {
case "C":
result = celsius
case "F":
result = celsiusToFahrenheit(celsius)
case "K":
result = celsiusToKelvin(celsius)
default:
return Temperature{}, fmt.Errorf("不支持的目标温度单位: %s", targetUnit)
}
return Temperature{Value: result, Unit: strings.ToUpper(targetUnit)}, nil
}
func main() {
// 测试基本转换
c := 25.0
f := celsiusToFahrenheit(c)
fmt.Printf("%.2f°C = %.2f°F\n", c, f)
f = 77.0
c = fahrenheitToCelsius(f)
fmt.Printf("%.2f°F = %.2f°C\n", f, c)
// 测试多种温度单位转换
temp := Temperature{Value: 100, Unit: "C"}
targets := []string{"F", "K"}
for _, target := range targets {
converted, err := ConvertTemperature(temp, target)
if err != nil {
fmt.Println("错误:", err)
} else {
fmt.Printf("%.2f%s = %.2f%s\n", temp.Value, temp.Unit, converted.Value, converted.Unit)
}
}
}
package main
import (
"fmt"
"sort"
"strings"
)
// 统计文本中的字符数、单词数、行数
func textStats(text string) (chars, words, lines int) {
chars = len(text)
words = len(strings.Fields(text))
lines = strings.Count(text, "\n") + 1
return
}
// 扩展功能:词频统计
func wordFrequency(text string) map[string]int {
words := strings.Fields(strings.ToLower(text))
freq := make(map[string]int)
for _, word := range words {
// 去除标点符号
cleanWord := strings.Trim(word, ".,!?;:\"'")
if cleanWord != "" {
freq[cleanWord]++
}
}
return freq
}
// 扩展功能:查找最长单词
func longestWord(text string) string {
words := strings.Fields(text)
longest := ""
for _, word := range words {
cleanWord := strings.Trim(word, ".,!?;:\"'")
if len(cleanWord) > len(longest) {
longest = cleanWord
}
}
return longest
}
// 按频率排序单词
func sortWordsByFrequency(freq map[string]int) []string {
type wordFreq struct {
word string
count int
}
var wordFreqs []wordFreq
for word, count := range freq {
wordFreqs = append(wordFreqs, wordFreq{word, count})
}
sort.Slice(wordFreqs, func(i, j int) bool {
return wordFreqs[i].count > wordFreqs[j].count
})
var result []string
for _, wf := range wordFreqs {
result = append(result, fmt.Sprintf("%s: %d", wf.word, wf.count))
}
return result
}
func main() {
text := `Go is an open source programming language that makes it easy to build simple,
reliable, and efficient software. Go is developed by Google.`
// 基本统计
chars, words, lines := textStats(text)
fmt.Printf("字符数: %d, 单词数: %d, 行数: %d\n", chars, words, lines)
// 词频统计
freq := wordFrequency(text)
fmt.Println("\n词频统计:")
sortedWords := sortWordsByFrequency(freq)
for _, wordCount := range sortedWords {
fmt.Println(wordCount)
}
// 最长单词
longest := longestWord(text)
fmt.Printf("\n最长单词: %s\n", longest)
}
package main
import (
"bufio"
"fmt"
"math/rand"
"os"
"strconv"
"time"
)
func playGuessingGame() {
// 初始化随机数种子
rand.Seed(time.Now().UnixNano())
// 生成1-100的随机数
target := rand.Intn(100) + 1
var guess int
attempts := 0
fmt.Println("猜一个1到100之间的数字")
reader := bufio.NewReader(os.Stdin)
for {
fmt.Print("请输入你的猜测: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
num, err := strconv.Atoi(input)
if err != nil {
fmt.Println("请输入有效的数字!")
continue
}
guess = num
attempts++
if guess < target {
fmt.Println("太小了!")
} else if guess > target {
fmt.Println("太大了!")
} else {
fmt.Printf("恭喜! 你用%d次猜中了数字%d\n", attempts, target)
break
}
}
}
func main() {
playGuessingGame()
}
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
type Contact struct {
Name string
Phone string
Email string
Address string
}
type AddressBook struct {
contacts []Contact
}
func (ab *AddressBook) AddContact(contact Contact) {
ab.contacts = append(ab.contacts, contact)
}
func (ab *AddressBook) FindContact(name string) *Contact {
for i, contact := range ab.contacts {
if contact.Name == name {
return &ab.contacts[i]
}
}
return nil
}
func (ab *AddressBook) DeleteContact(name string) bool {
for i, contact := range ab.contacts {
if contact.Name == name {
ab.contacts = append(ab.contacts[:i], ab.contacts[i+1:]...)
return true
}
}
return false
}
func (ab *AddressBook) ListContacts() {
fmt.Println("通讯录:")
for _, contact := range ab.contacts {
fmt.Printf("姓名: %s, 电话: %s, 邮箱: %s, 地址: %s\n",
contact.Name, contact.Phone, contact.Email, contact.Address)
}
}
func (ab *AddressBook) UpdateContact(name string, newContact Contact) bool {
for i, contact := range ab.contacts {
if contact.Name == name {
ab.contacts[i] = newContact
return true
}
}
return false
}
func showMenu() {
fmt.Println("\n===== 通讯录管理系统 =====")
fmt.Println("1. 添加联系人")
fmt.Println("2. 查找联系人")
fmt.Println("3. 删除联系人")
fmt.Println("4. 更新联系人")
fmt.Println("5. 显示所有联系人")
fmt.Println("6. 退出")
fmt.Print("请选择操作: ")
}
func main() {
addressBook := AddressBook{}
reader := bufio.NewReader(os.Stdin)
for {
showMenu()
choice, _ := reader.ReadString('\n')
choice = strings.TrimSpace(choice)
switch choice {
case "1":
fmt.Println("\n--- 添加联系人 ---")
fmt.Print("姓名: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
fmt.Print("电话: ")
phone, _ := reader.ReadString('\n')
phone = strings.TrimSpace(phone)
fmt.Print("邮箱: ")
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
fmt.Print("地址: ")
address, _ := reader.ReadString('\n')
address = strings.TrimSpace(address)
contact := Contact{
Name: name,
Phone: phone,
Email: email,
Address: address,
}
addressBook.AddContact(contact)
fmt.Println("联系人添加成功!")
case "2":
fmt.Print("\n请输入要查找的联系人姓名: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
contact := addressBook.FindContact(name)
if contact != nil {
fmt.Printf("找到联系人: 姓名: %s, 电话: %s, 邮箱: %s, 地址: %s\n",
contact.Name, contact.Phone, contact.Email, contact.Address)
} else {
fmt.Println("未找到该联系人")
}
case "3":
fmt.Print("\n请输入要删除的联系人姓名: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
if addressBook.DeleteContact(name) {
fmt.Println("联系人删除成功!")
} else {
fmt.Println("未找到该联系人")
}
case "4":
fmt.Print("\n请输入要更新的联系人姓名: ")
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
if addressBook.FindContact(name) == nil {
fmt.Println("未找到该联系人")
continue
}
fmt.Println("\n--- 更新联系人信息 ---")
fmt.Print("新电话: ")
phone, _ := reader.ReadString('\n')
phone = strings.TrimSpace(phone)
fmt.Print("新邮箱: ")
email, _ := reader.ReadString('\n')
email = strings.TrimSpace(email)
fmt.Print("新地址: ")
address, _ := reader.ReadString('\n')
address = strings.TrimSpace(address)
newContact := Contact{
Name: name,
Phone: phone,
Email: email,
Address: address,
}
if addressBook.UpdateContact(name, newContact) {
fmt.Println("联系人更新成功!")
}
case "5":
addressBook.ListContacts()
case "6":
fmt.Println("感谢使用通讯录管理系统,再见!")
return
default:
fmt.Println("无效的选择,请重新输入")
}
}
}
第1-3天:环境搭建与基础语法
第4-7天:数据类型与控制结构
第8-10天:函数与项目练习
第11-14天:综合练习与复习
A: 使用go mod init初始化模块,go mod tidy管理依赖。例如:
go mod init myproject
go mod tidy # 下载并整理依赖
go mod download # 下载依赖到本地缓存
A: Go设计哲学强调简洁,for循环足够灵活。Go的for循环可以:
A: defer语句按照后进先出(LIFO)的顺序执行。多个defer语句会压入栈中,函数返回时按相反顺序执行。
A: nil表示"无值",适用于指针、切片、映射、函数、接口和通道;空字符串""是一个有效的字符串值,长度为0。
A: 数组是固定长度的值类型,切片是动态长度的引用类型。切片底层依赖数组,但可以自动扩容。
A: 闭包是一个函数值,它引用了函数体之外的变量。该函数可以访问并赋予其引用的变量的值。
A: Go使用多返回值处理错误,通常函数返回一个结果和一个error类型值。error为nil表示成功,非nil表示失败。
A: :=是短变量声明,只能在函数内部使用,自动类型推断;var是完整声明,可在任何地方使用,需要显式指定类型或提供初始值。
A:
完成本阶段学习后,尝试回答以下问题:
完成本阶段学习后,进入第二阶段:核心概念学习,包括: