没有合适的资源?快使用搜索试试~ 我知道了~
首页Go语言高效编程指南:深入理解有效实践
"Effective Go 中文版是一份深入指南,旨在帮助程序员理解和编写高效、清晰的Go语言代码。Go语言虽然借鉴了其他编程语言的元素,但其独特的设计和特性使得直接移植其他语言的代码可能无法得到理想效果。为了编写出高质量的Go程序,理解语言特性和风格至关重要,包括命名规则、代码结构、程序组织等。 文档强调了阅读官方语言规范、Tour of Go和How to Write Go Code等资料的基础,以及Golang官方包作为示例的重要性。在实际编程过程中,库文档、代码和可执行示例可以帮助解答疑惑,展示最佳实践。 关于代码格式,Go语言采取了自动化的方式,通过工具gofmt自动处理大部分格式化问题,如缩进和对齐,避免人为风格的争议。然而,当遇到gofmt无法处理的新布局情况时,开发者需要审视并调整代码结构,或者向社区报告bug。例如,gofmt会自动管理结构体字段的注释格式,无需开发者手动整理。 Effective Go中文版提供了编写Go程序的实用建议,帮助读者遵循良好的编程习惯,提升代码质量,并充分利用Go语言的优势。无论是初学者还是经验丰富的开发者,都应该将其作为学习和参考的重要资源。"
资源详情
资源推荐
消除它们引起的错误情况,那么代码会非常易读。由于错误情况往往会结束于 return 语句,因此代码不需
要有 else 语句。
f, err := os.Open(name)
if err != nil {
return err
}
d, err := f.Stat()
if err != nil {
f.Close()
return err
}
codeUsing(f, d)
重新声明和重新赋值
另外:上一章节的最后一个例子,展示了 := 短声明形式的工作细节。该声明调用了 os.Open 进行读取,
f, err := os.Open(name)
该语句声明了两个变量, f 和 err 。几行之后,又调用了 f.Stat 进行读取,
d, err := f.Stat()
这看起来像是又声明了 d 和 err 。但是,注意 err 在两条语句中都出现了。这种重复是合法的: err 是在
第一条语句中被声明,而在第二条语句中只是被
重新赋值
。这意味着使用之前已经声明过的 err 变量调用
f.Stat ,只会是赋给其一个新的值。
在 := 声明中,变量 v 即使已经被声明过,也可以出现,前提是:
该声明和 v 已有的声明在相同的作用域中(如果 v 已经在外面的作用域里被声明了,则该声明将会创
建一个新的变量 §)
初始化中相应的值是可以被赋给 v 的
并且,声明中至少有其它一个变量将被声明为一个新的变量
这种不寻常的属性纯粹是从实用主义方面来考虑的。例如,这会使得在一个长的 if-else 链中,很容易地使
用单个 err 值。你会经常看到这种用法。
§ 值得一提的是,在Go中,函数参数和返回值的作用域与函数体的作用域是相同的,虽然它们在词法上是
出现在包裹函数体的大括号外面。
For
Go的 for 循环类似于—但又不等同于—C的。它统一了 for 和 while ,并且没有 do-while 。有三种形
Effective Go中文版
- 11 -本文档使用 看云 构建
式,其中只有一个具有分号。
// Like a C for
for init; condition; post { }
// Like a C while
for condition { }
// Like a C for(;;)
for { }
短声明使得在循环中很容易正确的声明索引变量。
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
如果你是在数组,切片,字符串或者map上进行循环,或者从channel中进行读取,则可以使用 range 子
句来管理循环。
for key, value := range oldMap {
newMap[key] = value
}
如果你只需要range中的第一项(key或者index),则可以丢弃第二个:
for key := range m {
if key.expired() {
delete(m, key)
}
}
如果你只需要range中的第二项(value),则可以使用
空白标识符
,一个下划线,来丢弃第一个:
sum := 0
for _, value := range array {
sum += value
}
空白标识符有许多用途,这在后面的章节中会有介绍。
对于字符串, range 会做更多的事情,通过解析UTF-8来拆分出单个的Unicode编码点。错误的编码会消
耗一个字节,产生一个替代的符文(rune)U+FFFD。(名字(与内建类型相关联的) rune 是Go的术
语,用于指定一个单独的Unicode编码点。详情参见the language specification)循环
Effective Go中文版
- 12 -本文档使用 看云 构建
for pos, char := range "日本\x80語" { // \x80 is an illegal UTF-8 encoding
fmt.Printf("character %#U starts at byte position %d\n", char, pos)
}
会打印出
character U+65E5 '日' starts at byte position 0
character U+672C '本' starts at byte position 3
character U+FFFD '�' starts at byte position 6
character U+8A9E '語' starts at byte position 7
最后,Go没有逗号操作符,并且 ++ 和 -- 是语句而不是表达式。因此,如果你想在 for 中运行多个变
量,你需要使用并行赋值(尽管这样会阻碍使用 ++ 和 -- )。
// Reverse a
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 {
a[i], a[j] = a[j], a[i]
}
Switch
Go的 switch 要比C的更加通用。表达式不需要为常量,甚至不需要为整数,case是按照从上到下的顺序
进行求值,直到找到匹配的。如果 switch 没有表达式,则对 true 进行匹配。因此,可以—按照语言习惯
—将 if - else - if - else 链写成一个 switch 。
func unhex(c byte) byte {
switch {
case '0' <= c && c <= '9':
return c - '0'
case 'a' <= c && c <= 'f':
return c - 'a' + 10
case 'A' <= c && c <= 'F':
return c - 'A' + 10
}
return 0
}
switch不会自动从一个case子句跌落到下一个case子句。但是case可以使用逗号分隔的列表。
Effective Go中文版
- 13 -本文档使用 看云 构建
剩余66页未读,继续阅读
xubojam
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端面试必问:真实项目经验大揭秘
- 永磁同步电机二阶自抗扰神经网络控制技术与实践
- 基于HAL库的LoRa通讯与SHT30温湿度测量项目
- avaWeb-mast推荐系统开发实战指南
- 慧鱼SolidWorks零件模型库:设计与创新的强大工具
- MATLAB实现稀疏傅里叶变换(SFFT)代码及测试
- ChatGPT联网模式亮相,体验智能压缩技术.zip
- 掌握进程保护的HOOK API技术
- 基于.Net的日用品网站开发:设计、实现与分析
- MyBatis-Spring 1.3.2版本下载指南
- 开源全能媒体播放器:小戴媒体播放器2 5.1-3
- 华为eNSP参考文档:DHCP与VRP操作指南
- SpringMyBatis实现疫苗接种预约系统
- VHDL实现倒车雷达系统源码免费提供
- 掌握软件测评师考试要点:历年真题解析
- 轻松下载微信视频号内容的新工具介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功