go语言面向过程 golang面向过程( 二 )


看到没有 , 如果不经常总结,这一圈学下来会把你整的稀里糊涂的 。
二、多比较
学一门新语言一定要与你之前已经熟悉的语言经常作比较 , 找出它们的相同与不同,这样才能加深记忆和理解,否则学完之后脑子里会一片混乱 , 搞不清谁是谁非了 。
就拿数组来说吧,在 Java、Scala、Go 中定义、实例化、赋值是不一样的 。
//Java
int[] arr;//定义数组,不可以指定数组长度
arr = new int[5];//创建数组对象(实例化),指定数组长度
arr[1] = 8;//赋值
//Scala
val arr = new Array[Int](5) //数组在Scala里用的是泛型类,构造函数参数指定数组大小
arr(1) = 8 //赋值,注意用的是括弧
//Go
arr := [5]int{} //创建数组,初始化5个元素都为0,注意如果不指定数组长度,则是另外一种类型Slice
arr[1] = 8 //赋值
再比如 Map 在 Scala 与 Go 语言里定义、初始化、访问也是不同的,作了以下比较后印象会非常深刻 , 把它们记下来,这样以后使用就不会搞混了 。
//Scala
val capital = Map("France" - "Paris", "Japan" - "Tokyo")
println(capital.get("France"))
//Go
capital := map[string]string{"France": "Paris", "Japan": "Tokyo"}
fmt.Println(capital["France"])
Go 同时给多个变量赋值在 Scala 里可以用模式匹配做到 , 如下:
//Scala(使用样本类的模式匹配)
case class Tao(name: String, age: Int);
val Tao(myName, myAge) = Tao("taozs", 18);
println(myName)
println(myAge)
//Go
myName, myAge := "taozs", 18
fmt.Println(myName)
fmt.Println(myAge)
//Scala(使用元组的模式匹配)
val (myNumber, myString) = (123, "abe")
println(myNumber)
println(myString)
//Go
myNumber, myString := 123, "abe"
fmt.Println(myNumber)
fmt.Println(myString)
以下是 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 里可以这样:

推荐阅读