【Go入门练中学】第1课:从零开始

本课目标:安装并运行 Go;看懂第一个程序;掌握变量、常量、基本类型和格式化输出;完成多元化习题。


一、准备:安装与运行

  1. 安装 Go:到 https://go.dev/dl/ 下载安装。
  2. 终端验证:
bash 复制代码
go version
  1. 创建项目目录:
bash 复制代码
mkdir hello-go
cd hello-go
go mod init hello-go
  1. 新建文件 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. 选择题

  1. Go 可执行程序的入口包名是?
    A. main
    B. fmt
    C. go
    D. package

答案:A

解读: Go 可执行程序必须声明 package main,并且包含 func main()。fmt 只是格式化输入输出包。


  1. 打印内容并自动换行用?
    A. fmt.Print
    B. fmt.Println
    C. fmt.Printf
    D. print

答案:B

解读: fmt.Println 会自动在多个参数之间加空格,并在末尾换行。Printf 不会自动换行。


  1. 下面哪个是短变量声明?
    A. var x int = 1
    B. x := 1
    C. const x = 1
    D. int x = 1

答案:B

解读: := 是短变量声明,只能在函数内部使用,会根据右边的值自动推断类型。


  1. 下面哪个不是 Go 的基本类型?
    A. int
    B. string
    C. bool
    D. class

答案:D

解读: Go 没有 class 关键字。Go 用结构体 struct 和方法来实现面向对象风格。


  1. 字符串的格式化占位符是?
    A. %d
    B. %s
    C. %f
    D. %t

答案:B

解读: %s 用于字符串;%d 用于整数;%f 用于浮点数;%t 用于布尔值。


B. 判断题

  1. Go 源文件扩展名是 .go。
    答案:对
    解读: Go 源代码文件统一使用 .go 后缀,例如 main.go。

  1. 可执行程序的入口包名必须是 main。
    答案:对
    解读: 可执行程序必须声明 package main,并且有且只有一个 func main() 作为入口。

  1. 函数内局部变量声明后未使用,Go 编译器会报错。
    答案:对
    解读: Go 对未使用的局部变量零容忍,声明后必须使用,否则编译失败。

  1. const 定义的常量可以在运行时修改。
    答案:错
    解读: const 是常量,编译期确定,不能被修改。试图重新赋值会编译错误。

  1. import 引入但未使用的包,可以通过编译。
    答案:错
    解读: Go 中引入但未使用的包会编译报错。要么使用它,要么删除 import。

C. 填空题

  1. 引入 fmt 包:____ "fmt"
    答案:import
    解读: 完整写法是 import "fmt"。多个包可以用括号分组导入。

  1. 主函数:func ____() { }
    答案:main
    解读: func main() 是 Go 可执行程序的入口函数。

  1. 声明整型变量 age 为 18:____ age int = 18
    答案:var
    解读: var age int = 18 是标准变量声明,也可以写成 age := 18。

  1. 短声明城市为"北京":city ____ "北京"
    答案::=
    解读: city := "北京" 是短变量声明,类型自动推断为 string。

  1. 格式化输出年龄:fmt.____("年龄:%d\n", age)
    答案:Printf
    解读: Printf 支持格式化占位符;%d 表示整数,\n 表示换行。

D. 代码阅读题

  1. 下面输出什么?
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 用来输出变量类型。


  1. 下面输出什么?
go 复制代码
package main

import "fmt"

func main() {
	name := "Go"
	fmt.Println("Hello", name)
}

答案:Hello Go

解读: fmt.Println 会在多个参数之间自动加空格,并在末尾换行。


  1. 下面输出什么?
go 复制代码
package main

import "fmt"

func main() {
	const pi = 3.14159
	fmt.Printf("%.2f\n", pi)
}

答案:3.14

解读: %.2f 表示保留两位小数,会进行四舍五入。


E. 改错题

  1. 下面代码缺少什么?
go 复制代码
import "fmt"

func main() {
	fmt.Println("hi")
}

答案:缺少 package main,应放在第一行。

go 复制代码
package main

import "fmt"

func main() {
	fmt.Println("hi")
}

解读: 可执行程序必须属于 main 包,package main 必须写在文件最前面。


  1. 下面代码为什么编译失败?如何改?
go 复制代码
package main

import "fmt"

func main() {
	x := 1
}

答案:x 声明后未使用。可以打印它,或删除它。

go 复制代码
package main

import "fmt"

func main() {
	x := 1
	fmt.Println(x)
}

解读: Go 要求局部变量声明后必须使用,否则编译报错。


  1. 下面代码为什么编译失败?如何改?
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. 编程题

  1. 定义姓名、年龄、城市三个变量,用 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 对应整数。


  1. 定义常量 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 保留两位小数输出面积。


  1. 定义 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. 挑战题

  1. 使用 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 计算明年年龄。


  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,做一个猜数字小游戏。

相关推荐
isfox1 小时前
Python 的 @classmethod 和 @staticmethod:什么时候用哪个,一次说清楚
后端
薛定谔的算法1 小时前
前端视角秒懂:Java 和 Spring Boot 的关系,就像 JS 和 React
后端
颜进强1 小时前
从零搭一套 WorkBuddy Skill 骨架:调接口 → 生成 HTML 报告的分层设计与流转拆解
前端·后端·ai编程
寒蝉1282 小时前
从真实业务场景看缓存的代价
后端
深蓝AI2 小时前
Agent 记忆层落地实战:抽取、整合、存储、检索,为什么大上下文窗口救不了你
后端·架构
steven1582 小时前
第 17 章 组件与配置问题
后端
dkbnull2 小时前
Spring Boot配置文件敏感信息加密解密
spring boot·后端
她的男孩2 小时前
安全同事找我要"上周所有登录失败记录",我查完数据库:一条都没有
java·后端·架构