go语言代码记知识点 go语言编程入门与实战技巧( 八 )


以下是 Scala 和 Go 定义和实现函数的区别:
//Scala
val increase: Int = Int = (x: Int) = x + 1
println(increase(8))
//Go
var increase func(int) int = func(x int) int { return x + 1 }
fmt.Println(increase(8))
除了在 Scala 和 Go 里都可以类型推导外,在 Scala 里还可以这样定义函数:
//Scala
val increase = (_: Int) + 1
为方便自己将来随时查阅,可以建立下面这样的对比表格,描述不一定要求规范,自己能看懂就行 。
三、转变思维方式,
学会用这门语言去思考
学会用语言去思考是关键 。如果你以前是学 C 的,转学 Java,你一定要改变以前面向过程的思维,学会用面向对象的思维去分析问题;以前学 Java 的,转学 Scala 则要学会用函数式的编程思维解决问题 。
举一个函数式编程的例子,以下是 Java 语言常用的 for 循环,循环变量从 1 到 10 执行 10 次循环体:
// 命令式编程
for (int i = 1; i10; i++) {
// 此处是循环体做10次
}
这被称为命令式编程 (Imperative Programming),但学了 Scala 的函数式编程 (Functional Programming) 后 , 解决同样的问题,我们可以换一种思维:构建 1 到 10 的列表序列,针对列表中的`每个元素分别执行函数 , 如下:
//函数式编程
val autoList = (1 to 10).map(i = /*此处是函数体,针对1到10的每一个分别调用 1次*/)
已经习惯了 Java 编程的 , 对 Scala 的函数式编程、样本类、模式匹配、不可变对象、隐式转换等需要一个逐步适应的过程,要渐渐学会用它们思考和解决问题 。
再举个 Scala 与 Go 思维方式不同的例子,要实现对一个字符串里的每个字符加 1 的操作 , Scala 里可以这样:
"abc".map(cc = cc + 1)
"abc"是一个字符串对象 , 调用它的方法 map , 这是纯面向对象的思维 , 但在 Go 里就要转变为面向过程的思维:
name := "abc"
second := strings.Map(func(x rune) rune {
return x + 1
}, name)
注意,这里的 strings 是包 (package),调用它的公共函数 Map,被人操作的对象 name 字符串作为函数参数传入 。Go 提供的函数 len、cap、append、 等其实都是面向过程的,虽然 Go 也提供有面向对象的支持,已经习惯了面向对象编程的,刚开始学 Go 语言需要特别留意这一点 。
四、多看开源代码
学一门语言就是学一种思维方式 , 如今 GitHub 上可下载的开源代码海量级,通过看别人的代码,学习别人是如何解决问题的,养成用该语言思考的习惯,另外还能学习到一些非常有用的技巧,比如我在看一个 Go 语言性能测试框架代码时看到有以下写法:
func main() {
defer profile.Start().Stop()
...
}
这个意思是指刚进入程序时执行 Start( ) 函数,程序退出前调用 Stop( ) 函数,非常好的技巧啊!可以用于需要在程序执行前和程序完成后分别执行一段逻辑的场景 。再看 Start( ) 函数是怎么实现的:
func Start(options ...func(*Profile)) interface {
Stop()
} {
...
return prof
}
该函数返回了一个实现了含有 Stop( ) 函数接口的对象,如此才能在调用 Start 调用后连调 Stop 。
五、优先学会使用代码分析工具
代码分析的工具包括静态检查、测试、测试覆盖率分析、性能分析(内存、CPU)、调试工具等,工具的价值在于它可以有效帮我们发现代码问题,这在我们刚开始学一门编程语言时意义尤其重大 。
例如,以下这句 Java 赋值语句估计没有哪本教科书会告诉你有性能问题:

推荐阅读