1. 第一个程序
作为一个DBA,我平时用的比较多的语言是Java和Python,Java用来写后端存储层代码,Python用来写一些小工具辅助工作。
我是首先学会了Java,因此Python对我来说有几点难以忍受的问题:
- 弱类型语言,很多时候我不知道一个函数到底返回了什么,不看源码不知道;
- 依赖不像Java一样可以用maven这样的工具整合在一个jar包里(或许是我不会)。
因此我决定学一下Go语言,其实这些和上面我是否能忍受Python没多大关系,我就是想学Go而已。
按理说我此时应该写一段Hello World代码表示我现在开始学习Go语言了,但是我偏不。
因为我又不是零基础,没有必要写一个Hello World来体验一门语言的乐趣,何况Hello World一点乐趣都没有。
用过Java的人都知道Junit,用来做单元测试的,Go也有类似的东西,那么下面我的第一段代码就要用Test来写:
package ch1
import "testing"
func TestGo(t *testing.T) {
t.Log("Hello, World!")
}
其实我现在也不知道TestGo函数里的指针到底是干啥的,但是我以后一定会知道。这段代码很简单:
- 首先声明了包,这一点和Java很像;
- 然后引入了一个包testing,这一点和Java还是很像;
- 之后声明了一个函数,函数的参数t有一个Log方法,这个方法可以打印;
- 参数t是一个指针类型(不知道这样说对不对,我依稀对C语言有点印象,就借用一下说法)。

上图是这段测试代码的测试结果。
2. 变量和常量
写代码哪有不操作变量的?Go语言中,使用var关键字来声明变量,比如:
var a int
var b bool
这种方式很像Java,不过就是多了var关键字并且将类型写在了最后,既然如此像Java,那么一定还支持这种形式的声明:
var a int = 1
var b bool = false
当然,Go语言还支持自动推断类型,比如:
func example() {
a:=1
}
系统会自动推断a的类型,但是注意,我这里特意写了一个函数,不是我闲得慌,是因为自动推断类型的:=只能用于函数内部。
当然我自己很不喜欢自动推断类型,不过我还是很喜欢Go的另外一种声明方式:
var i, j int = 1, 2
这样代码能短小不少,但是我个人觉得这种声明方式如果变量多,可读性就会变得比较差。
至于Go语言的基本类型,可以查阅相关资料,我现在也没有记完全,还是不在这里献丑了。
Go是支持常量定义的,使用关键字const就可以,常量是不支持:=自动推断的。Go有一个iota的东西,在定义常量的时候异常好用:
package ch1
import "testing"
const (
a = iota + 1
b
c
d
e
)
func TestGo(t *testing.T) {
t.Log(a, b, c, d, e)
}
猜猜这段代码会输出什么?
答案是1 2 3 4 5,但是实际上我并没有给a以外的常量赋值,这就是iota的好处了。iota是常量计数器,出现的时候会被置为0,因此我上面那个加1操作其实就是将数值1赋值给了a。
3. 大学时程序设计课用过的例子
大学的程序设计课最喜欢的例子之一就是九九乘法表了吧,用于介绍多层循环练手用的,虽然我还没有怎么详细的看过循环,但是写一个还是没有问题的,因为我没有研究过Log的格式化输出,那么还是用命令行输出吧。
代码如下:
package ch1
import (
"fmt"
"testing"
)
func multiplication() {
for i := 1; i < 10; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("%d X %d = %d ", i, j, i*j)
}
fmt.Println()
}
}
func TestGo(t *testing.T) {
multiplication()
}
Go的循环只有for一种,但是有多种组合方式,也能做while循环,Go的初衷是减少关键字。
这里的格式化terminal输出,还是让我回忆起了C语言,和我遥远的大学岁月。
还有一道题挺有意思,就是斐波那契数列:
1, 1, 2, 3, 5, 8, 13
每一个值都是前两个值的和,那么代码如何实现呢?
package ch1
import (
"fmt"
"testing"
)
func fib() {
var a, b int = 1, 1
var fib_arr [7]int
//fmt.Println(a, b)
fib_arr[0], fib_arr[1] = a, b
for i := 0; i < 5; i++ {
tmp := a + b
a = b
b = tmp
fib_arr[i+2] = tmp
}
for _, v := range fib_arr {
fmt.Printf("%d ", v)
}
}
func TestGo(t *testing.T) {
fib()
}
这里用到了数组,数组这东西我一直不太喜欢用,Java中我更倾向于使用容器,不知道Go语言中有没有一样好用的容器。
4. 小小总结
Go,如果运气好,学习Go的时候能把我原来一直搞不懂的C指针问题搞明白,那我就真的很开心了,
思而不学则殆。
推荐一本书:《码农翻身》,真的很棒。
网友评论