本课目标:安装并运行 Go;看懂第一个程序;掌握变量、常量、基本类型和格式化输出;完成多元化习题。
一、准备:安装与运行
- 安装 Go:到 https://go.dev/dl/ 下载安装。
- 终端验证:
bash
go version
- 创建项目目录:
bash
mkdir hello-go
cd hello-go
go mod init hello-go
- 新建文件 main.go。
二、第一个 Go 程序
go
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
运行:
bash
go run main.go
编译成可执行文件:
bash
go build -o hello main.go
./hello
关键点:
· package main:可执行程序入口包。
· import "fmt":引入格式化输入输出包。
· func main():主函数,程序从这里开始。
· fmt.Println:打印内容并换行。
三、变量、常量与基本类型
go
package main
import "fmt"
func main() {
var name string = "小明"
var age int = 18
city := "北京"
const pi = 3.14
fmt.Println(name, age, city, pi)
fmt.Printf("姓名:%s,年龄:%d,城市:%s\n", name, age, city)
fmt.Printf("pi=%.2f,类型=%T\n", pi, pi)
}
常用类型:
类型 说明 零值
int 整数 0
float64 小数 0
string 字符串 ""
bool 布尔 false
常见坑:
· 函数内局部变量声明后必须使用,否则编译报错。
· import 引入但未使用的包也会编译报错。
· := 只能在函数内使用,且左边至少有一个新变量。
· Println 会自动加空格和换行,Printf 不会自动换行。
四、多元化习题(每题后附答案与解读)
A. 选择题
- Go 可执行程序的入口包名是?
A. main
B. fmt
C. go
D. package
答案:A
解读: Go 可执行程序必须声明 package main,并且包含 func main()。fmt 只是格式化输入输出包。
- 打印内容并自动换行用?
A. fmt.Print
B. fmt.Println
C. fmt.Printf
D. print
答案:B
解读: fmt.Println 会自动在多个参数之间加空格,并在末尾换行。Printf 不会自动换行。
- 下面哪个是短变量声明?
A. var x int = 1
B. x := 1
C. const x = 1
D. int x = 1
答案:B
解读: := 是短变量声明,只能在函数内部使用,会根据右边的值自动推断类型。
- 下面哪个不是 Go 的基本类型?
A. int
B. string
C. bool
D. class
答案:D
解读: Go 没有 class 关键字。Go 用结构体 struct 和方法来实现面向对象风格。
- 字符串的格式化占位符是?
A. %d
B. %s
C. %f
D. %t
答案:B
解读: %s 用于字符串;%d 用于整数;%f 用于浮点数;%t 用于布尔值。
B. 判断题
- Go 源文件扩展名是 .go。
答案:对
解读: Go 源代码文件统一使用 .go 后缀,例如 main.go。
- 可执行程序的入口包名必须是 main。
答案:对
解读: 可执行程序必须声明 package main,并且有且只有一个 func main() 作为入口。
- 函数内局部变量声明后未使用,Go 编译器会报错。
答案:对
解读: Go 对未使用的局部变量零容忍,声明后必须使用,否则编译失败。
- const 定义的常量可以在运行时修改。
答案:错
解读: const 是常量,编译期确定,不能被修改。试图重新赋值会编译错误。
- import 引入但未使用的包,可以通过编译。
答案:错
解读: Go 中引入但未使用的包会编译报错。要么使用它,要么删除 import。
C. 填空题
- 引入 fmt 包:____ "fmt"
答案:import
解读: 完整写法是 import "fmt"。多个包可以用括号分组导入。
- 主函数:func ____() { }
答案:main
解读: func main() 是 Go 可执行程序的入口函数。
- 声明整型变量 age 为 18:____ age int = 18
答案:var
解读: var age int = 18 是标准变量声明,也可以写成 age := 18。
- 短声明城市为"北京":city ____ "北京"
答案::=
解读: city := "北京" 是短变量声明,类型自动推断为 string。
- 格式化输出年龄:fmt.____("年龄:%d\n", age)
答案:Printf
解读: Printf 支持格式化占位符;%d 表示整数,\n 表示换行。
D. 代码阅读题
- 下面输出什么?
go
package main
import "fmt"
func main() {
var a = 10
b := 3.5
fmt.Printf("%T %T\n", a, b)
}
答案:int float64
解读: var a = 10 自动推断为 int;b := 3.5 自动推断为 float64;%T 用来输出变量类型。
- 下面输出什么?
go
package main
import "fmt"
func main() {
name := "Go"
fmt.Println("Hello", name)
}
答案:Hello Go
解读: fmt.Println 会在多个参数之间自动加空格,并在末尾换行。
- 下面输出什么?
go
package main
import "fmt"
func main() {
const pi = 3.14159
fmt.Printf("%.2f\n", pi)
}
答案:3.14
解读: %.2f 表示保留两位小数,会进行四舍五入。
E. 改错题
- 下面代码缺少什么?
go
import "fmt"
func main() {
fmt.Println("hi")
}
答案:缺少 package main,应放在第一行。
go
package main
import "fmt"
func main() {
fmt.Println("hi")
}
解读: 可执行程序必须属于 main 包,package main 必须写在文件最前面。
- 下面代码为什么编译失败?如何改?
go
package main
import "fmt"
func main() {
x := 1
}
答案:x 声明后未使用。可以打印它,或删除它。
go
package main
import "fmt"
func main() {
x := 1
fmt.Println(x)
}
解读: Go 要求局部变量声明后必须使用,否则编译报错。
- 下面代码为什么编译失败?如何改?
go
package main
import "fmt"
func main() {
var name string = "Tom"
name := "Jerry"
fmt.Println(name)
}
答案:name 已经声明,不能再次用 :=。应改为 =。
go
package main
import "fmt"
func main() {
var name string = "Tom"
name = "Jerry"
fmt.Println(name)
}
解读: := 是声明并赋值,要求左边至少有一个新变量;同一作用域内不能重复声明同名变量。
F. 编程题
- 定义姓名、年龄、城市三个变量,用 Println 和 Printf 各输出一次。
答案:
go
package main
import "fmt"
func main() {
name := "小明"
age := 18
city := "北京"
fmt.Println("姓名:", name, "年龄:", age, "城市:", city)
fmt.Printf("姓名:%s,年龄:%d,城市:%s\n", name, age, city)
}
解读: Println 适合简单输出,多个参数自动加空格;Printf 适合格式化输出,%s 对应字符串,%d 对应整数。
- 定义常量 PI = 3.14,半径 r = 2.5,计算圆面积并保留两位小数输出。
答案:
go
package main
import "fmt"
func main() {
const PI = 3.14
r := 2.5
area := PI * r * r
fmt.Printf("面积:%.2f\n", area)
}
解读: const 定义常量,不能修改;r := 2.5 推断为 float64;%.2f 保留两位小数输出面积。
- 定义 a, b := 1, 2,交换两个变量的值并打印。
答案:
go
package main
import "fmt"
func main() {
a, b := 1, 2
a, b = b, a
fmt.Println("a =", a, "b =", b)
}
解读: Go 支持多重赋值,a, b = b, a 可以一次性完成交换,不需要临时变量。
G. 挑战题
- 使用 fmt.Scanln 输入姓名和年龄,输出:你好,XXX,你明年YY岁。
答案:
go
package main
import "fmt"
func main() {
var name string
var age int
fmt.Print("请输入姓名和年龄(空格分隔):")
fmt.Scanln(&name, &age)
fmt.Printf("你好,%s,你明年%d岁\n", name, age+1)
}
解读: fmt.Scanln 从标准输入读取数据,&name 和 &age 是取地址,表示把输入写入变量。age+1 计算明年年龄。
- 输入摄氏温度,输出华氏温度。公式:华氏 = 摄氏 * 9 / 5 + 32。
答案:
go
package main
import "fmt"
func main() {
var c float64
fmt.Print("请输入摄氏温度:")
fmt.Scanln(&c)
f := c*9/5 + 32
fmt.Printf("华氏温度:%.2f\n", f)
}
解读: c 是 float64,所以 c*9/5 会按浮点数计算,不会变成整数除法。%.2f 保留两位小数输出华氏温度。
下节预告:if、for、switch,做一个猜数字小游戏。