
示例工程教程【免费下载链接】learngo❤️ 1000 Hand-Crafted Go Examples, Exercises, and Quizzes. Learn Go by fixing 1000 tiny programs.项目地址https://gitcode.com/gh_mirrors/le/learngo点击查看免费下载Go 是一种静态类型语言不同类型的值不能直接参与运算或相互赋值这既是安全性的来源也是初学者的第一道坎。本文以 learngo 中文版教程 06-变量/05-类型转换/练习/README.md 为骨架结合仓库内的教学源码与全部 5 个 Convert and Fix 练习含解答系统讲解类型转换语法、破坏性转换陷阱、转换顺序问题与信息丢失问题。读完本文你将能独立判断何时需要转换、转换应放在哪一侧以及如何用int、float64、string等转换表达式修复编译错误并输出正确结果。一、为什么需要类型转换在进入练习之前先看仓库中两个对照示例它们揭示了类型转换的两条核心规则。1. 转换可能是破坏性操作01-破坏性的/main.go 展示了最经典的场景package main import fmt func main() { speed : 100 // int force : 2.5 // float64 // 错误: speed speed * force // ERROR: invalid op // 转换可以是一个破坏性的操作 // force 失去了它的分数部分... speed speed * int(force) fmt.Println(speed) }如果直接写speed speed * force编译器会报invalid operation无效操作因为int与float64不能直接相乘。修复方式是先把force转换成intint(force)会把2.5截断成2小数部分被丢弃因此结果不是250而是200。这就是破坏性转换的含义——从浮点数转整数时精度不可避免地损失。2. 转换的顺序很重要02-正确的/main.go 展示了同样的算式如何通过先提升、后截断保住计算精度package main import fmt // 转化的顺序很重要... func main() { speed : 100 force : 2.5 fmt.Printf(speed : %T\n, speed) fmt.Printf(conversion: %T\n, float64(speed)) fmt.Printf(expression: %T\n, float64(speed)*force) // 类型不匹配: // speed 是 int // expression 是 float64 // speed float64(speed) * force // 正确: int * int speed int(float64(speed) * force) fmt.Println(speed) }这里的关键在于运算过程与赋值目标的类型分离float64(speed) * force先把speed提升为float64两个float64相乘结果250.0是精确的int(...)最后再对完整结果做一次截断得到250。对比第一节的写法speed * int(force)虽然两者都能通过编译但前者在转换前完成了浮点运算、只损失一次精度后者则提前把2.5截成2损失了计算精度。先提升、后截断是浮点与整数混合运算的推荐写法。二、类型转换语法速览Go 的转换表达式语法是T(x)其中T是目标类型x是被转换的值。03-数型转换/main.go 集中展示了数字类型之间、数字到字符串的转换规则package main import fmt func main() { var apple int var orange int32 // 错误: 不能将 orange 赋值到 apple 上 (不同的类型) // apple orange // 你需要将 orange 转换为 apple apple int(orange) // 你不能将一个数字类型转换为布尔类型 // isDelicious : bool(orange) // 但是你可以将 int 转换为 string // 这只对 int 类型生效 orange 65 // 65 is A color : string(orange) fmt.Println(color) // 这不能运行。65.0 是 float. // fmt.Println(string(65.0)) // 这能运行: 这有两个 byte 值 // byte 也是 int fmt.Println(string([]byte{104, 105})) _ apple }从这段源码可以提炼出几条可验证的规则转换是否合法说明int(orange)int32 → int合法同为数字类型可相互转换bool(orange)int32 → bool不合法数字不能转换为布尔值string(orange)int32 → string合法仅对整数类型生效65对应 ASCII 字符Astring(65.0)float → string不合法浮点数不能直接转字符串string([]byte{104, 105})合法byte本质是整数字节切片可转字符串输出hi注意最后一条byte是uint8的别名因此字节切片转字符串是合法的这也是 Go 中将字节序列还原为文本的常见手段。三、5 个 Convert and Fix 练习详解这是本文的主体。每个练习都给出有错误的代码要求你找到错误并用正确的类型转换修复。建议先自行尝试再对照解答。练习 #1修复int float64的加法题目文件01-convert-and-fix/main.gopackage main func main() { // a, b : 10, 5.5 // fmt.Println(a b) }期望输出15.5问题分析a是int10b是float645.5a b是混合类型运算编译失败。由于期望输出是15.5带小数正确的做法是把int侧提升为float64而不是把b截断成整数。解答01-convert-and-fix/solution/main.gopackage main import fmt func main() { a, b : 10, 5.5 fmt.Println(float64(a) b) }要点当期望结果是浮点数时应提升整数一侧即float64(a) b得到15.5。练习 #2修复跨类型赋值题目文件02-convert-and-fix-2/main.gopackage main func main() { // a, b : 10, 5.5 // a b // fmt.Println(a b) }期望输出10.5问题分析a b试图把float64赋给int变量Go 不允许隐式类型转换。同时最后a b依然是混合类型。修复思路是把b截断后赋给aa int(b)得到10再把a提升为float64参与加法。解答02-convert-and-fix-2/solution/main.gopackage main import fmt func main() { a, b : 10, 5.5 a int(b) fmt.Println(float64(a) b) }运算过程int(b)把5.5截断为5赋给afloat64(a) b即10.0 5.5 15.5……等等期望输出是10.5这里需要重新核对a初始为10a int(b)后a变为5那么float64(a) b 5.0 5.5 10.5。正确输出10.5。注意本题的坑点在于a被b覆盖这是先转换、再赋值、后使用的典型流程。练习 #3最简单的修复题目文件03-convert-and-fix-3/main.go期望输出5.5。解答03-convert-and-fix-3/solution/main.gopackage main import fmt func main() { fmt.Println(5.5) }这一题极简目的是让你先跑通改代码 → 编译 → 运行 → 对照期望输出的完整闭环为后续较难的题目热身。练习 #4常量与变量混合运算题目文件04-convert-and-fix-4/main.go涉及7.5 ageage为int。解答04-convert-and-fix-4/solution/main.gopackage main import fmt func main() { age : 2 fmt.Println(7.5 float64(age)) }要点7.5是浮点常量age是int变量两者不能直接相加把变量age转换为float64后得到7.5 2.0 9.5。注意 Go 对无类型常量如7.5与有类型变量如age的区分——常量的类型由上下文决定而变量的类型是固定的。练习 #5避免转换时的信息丢失题目文件05-convert-and-fix-5/main.go解答05-convert-and-fix-5/solution/main.gopackage main import fmt func main() { min : int8(127) max : int16(1000) fmt.Println(max int16(min)) // 解释 // // int8(max) 损失了 max 的信息 // 导致它减小到了 127 // 也就是 int8 的最大值 // // 正确的转换是 int16(min) // 因为 int16 int8 // 当你这样做时, min 不会损失信息 // // 你会在 Go 类型系统 这节学到更多 }这是最有价值的一题它揭示了转换的信息丢失方向性错误的做法是int8(max)max 1000超出了int8的范围-128 ~ 127会被截断为127信息严重丢失正确的做法是int16(min)int16能容纳int8的所有取值min 127无损升级1000 127 1127。通用原则向更宽的类型转换不会丢信息向更窄的类型转换可能丢信息。当你需要统一两个不同整数类型的运算时优先把窄类型提升为宽类型。更系统的位宽、溢出与定义类型知识可继续学习仓库中的 09-go-type-system 章节。四、配套知识点自测来自问题集与练习配套的 问题/questions.md 收录了 6 道选择题覆盖了练习之外的重要概念务必理解每一题1. 正确的类型转换表达式是哪个convert(40) ✗ var(hi) ✗ int(4.) ✓ ← 正确语法是 类型(值) int[4] ✗Go 的转换表达式是T(x)函数式写法不是关键字加括号、也不是下标语法。2.age : 6.5; fmt.Print(int(age))打印什么打印6。把 float 转成 int 会丢失小数部分截断而非四舍五入。3.fmt.Print(int(6.5))打印什么答案是Compile-Time Error。6.5是无类型常量常量转换的结果必须是精确的int(6.5)会丢失精度因此 Go在编译期就拒绝该表达式。对比上一题age是float64变量变量转int允许截断因此是运行时行为。4.area : 10.5; fmt.Print(area/2)打印什么打印5.25。无类型常量2会自动适配为float64参与除法。5.area : 10.5; div : 2; fmt.Print(area/div)打印什么答案是ERROR。div是int变量不能除以不同类型的值与第 4 题形成鲜明对比——常量可自适应变量必须显式转换。6. 哪段代码能修复上面的错误fmt.Print(int(area)/div) // 5 可用但会截断精度 fmt.Print(area/int(div)) // 类型不匹配不可用 fmt.Print(int(area)/int(div)) // 5 可用但会截断精度 fmt.Print(area/float64(div)) // ✓ 5.25 正确先提升再运算正确答案是area/float64(div)把整数变量提升为float64后再除法既修复了类型不匹配又保住了10.5 / 2.0 5.25的精确结果。前两个可编译选项因先截断area而得到5属于能跑但错误的答案。五、总结类型转换的三条铁律综合教学源码、练习与问题集可以把 Go 类型转换的核心知识收敛为三条规则类型不匹配必须显式转换Go 没有隐式类型转换int与float64乃至int与int32之间既不能直接运算也不能相互赋值转换可能是破坏性的float64 → int会截断小数部分向更窄的整数类型转换会溢出截断。因此混合运算推荐先提升为宽类型、运算完再截断的顺序见 02-正确的/main.go常量与变量规则不同无类型常量可自适应上下文area/2合法而变量必须显式转换area/div报错常量转换精度要求更高int(6.5)直接编译失败。完成这 5 个练习练习目录并吃透配套问题集你就掌握了 Go 变量章节中最容易出错的一环。后续在 07-printf 格式化输出、08-numbers-and-strings 数字与字符串、以及 09-go-type-system 类型系统中这些转换知识会被反复用到。赞分享示例工程教程【免费下载链接】learngo❤️ 1000 Hand-Crafted Go Examples, Exercises, and Quizzes. Learn Go by fixing 1000 tiny programs.项目地址https://gitcode.com/gh_mirrors/le/learngo点击查看免费下载相关推荐Learngo Type Conversion 实战修复 5 个 Convert and Fix 练习彻底掌握 Go 类型转换Learngo Type Conversion 实战修复 5 个 Convert and Fix 练习彻底掌握 Go 类型转换 导读 本篇文章围绕 06 v示例工程教程彻底搞懂PyMySQL数据类型映射避免90%的类型转换坑彻底搞懂PyMySQL数据类型映射避免90%的类型转换坑 你是否曾遇到Python整数存入MySQL变成字符串datetime对象读取后格式异常本文将系统数据库数据库客户端后端Winterfell性能优化技巧打造高性能React表单应用Winterfell性能优化技巧打造高性能React表单应用 在现代Web应用开发中表单是用户交互的核心组件而React表单库Winterfell凭借其J上一篇B站视频下载器完整指南专业解锁大会员4K与充电专属内容下一篇B站视频下载终极指南免费解锁大会员4K和充电专属内容创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考