Go语言基础概念
2014年2月17日 go语言学习
个人论述:关于程序语言,每个程序员都有不同的看法和观点,有人觉得C++语言好用,够快;有人觉得C语言好用够强大,又有人觉得Java好用,够简洁。目前编程语言数不胜数了,目前排在前面的还是C、C++、Java,这三种语言使用人数最多的,历史也是最悠久的。它们都是经过无数程序员千锤百炼而慢慢成熟起来的,现在很难评判说到底哪个语言好用或者开发出来的程序功能强大,讨论这些是没有意义的,一个语言到底能做什么东西全靠程序员个人的功力和对语言的熟悉程度,它毕竟是一个工具,工具是我们开发程序的利器,只有万般打磨才能变得锋利无比。自然使用过很多种语言的大牛来说,自然有自己喜爱的语言,因为他可能更明白每一种语言的特性,哪一种能让自己开发变得轻松自在。所以对于语言的评判,是没有标准答案的,我每次看到程序员因为语言而吵起来我就觉得好笑,有这种闲心不如多提升自己的技术水平好过。对我而言,能开发出好的应用好的软件的语言就是好语言,只有喜不喜欢,没有好不好之说。
为了扩展自己的知识面呢,小巫也开始打算学习新的语言,毕竟技术这个东西,有时候怎么死的都不知道,跟着潮流走可以降低自己的风险。Go语言呢,也有几年的时间了,是Google推出的第二款开源语言,我稍微学了一下,发现它似乎不太符合我的口味,虽说它看起来很简洁,把一些不必要的东西去除掉,但可读性似乎差了点。因为还没深入学,没有体会到开发这门语言的大神的用意,所以先放下自己的偏见,试着把这门语言入门一些。
最简单Go语言程序
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
接下来我会逐一介绍Go语言的基础概念,如下
1. 包是什么?
2. 导入和导出
3. 函数
4. 返回值
5. 变量的声明
6. Go语言基本数据类型
7. 常量的定义
这里推荐一个在线编程学习的网站吧(FenBy),关于Go语言的摘录我是从这个网站里学习的。
http://www.fenby.com/course/units/1015#top
小巫注:
在导入了一个包之后,就可以用其导出的名称来调用它。在 Go 中,首字母大写的名称是被导出的。
Foo
和 FOO
都是被导出的名称。名称 foo
是不会被导出的。执行代码。然后将 math.pi
改名为 math.Pi
再试着执行一下。
package main import ( "fmt" "math" ) func main() { fmt.Println(math.pi) }
package main import "fmt" func add(x int, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) }
package main import "fmt" func add(x, y int) int { return x + y } func main() { fmt.Println(add(42, 13)) }
package main import "fmt" type Vertex struct { X, Y int } func main() { v := new(Vertex) fmt.Println(v) v.X, v.Y = 11, 9 fmt.Println(v) }
package main import ( "fmt" "math" ) func main() { hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y) } fmt.Println(hypot(3, 4)) }
package main import "fmt" func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } } func main() { pos, neg := adder(), adder() for i := 0; i < 10; i++ { fmt.Println( pos(i), neg(-2*i), ) } }
现在来通过函数做些有趣的事情。
实现一个 fibonacci
函数,返回一个函数(一个闭包)可以返回连续的斐波纳契数。
package main import "fmt" // fibonacci 函数会返回一个返回 int 的函数。 func fibonacci() func() int { var count,sum1,sum2 int = 0,1,1 return func() int { switch count { // 0和1,fib =1 case 0,1: count++; default: sum1,sum2 = sum2, sum1+sum2 } return sum2 } } func main() { f := fibonacci() for i := 0; i < 10; i++ { fmt.Println(f()) } }
函数可以返回任意数量的返回值。
这个函数返回了两个字符串。
package main import "fmt" func swap(x, y string) (string, string) { return y, x } func main() { a, b := swap("hello", "world") fmt.Println(a, b) }
函数接受参数。在 Go 中,函数可以返回多个“结果参数”,而不仅仅是一个值。它们可以像变量那样命名和使用。
如果命名了返回值参数,一个没有参数的 return
语句,会将当前的值作为返回值返回。
package main import "fmt" func split(sum int) (x, y int) { x = sum * 4 / 9 y = sum - x return } func main() { fmt.Println(split(17)) }
var
语句定义了一个变量的列表;跟函数的参数列表一样,类型在后面。
package main import "fmt" var x, y, z int var c, python, java bool func main() { fmt.Println(x, y, z, c, python, java) }
变量定义可以包含初始值,每个变量对应一个。
如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。
package main import "fmt" var x, y, z int = 1, 2, 3 var c, python, java = true, false, "no!" func main() { fmt.Println(x, y, z, c, python, java) }
在函数中,`:=` 简洁赋值语句在明确类型的地方,可以用于替代 var
定义。
(`:=` 结构不能使用在函数外,函数外的每个语法块都必须以关键字开始。)
package main import "fmt" func main() { var x, y, z int = 1, 2, 3 c, python, java := true, false, "no!" fmt.Println(x, y, z, c, python, java) }
Go 的基本类型有Basic types
bool string
int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 的别名
rune // int32 的别名 // 代表一个Unicode码
float32 float64
complex64 complex128
常量的定义与变量类似,只不过使用 const
关键字。
常量可以是字符、字符串、布尔或数字类型的值。
package main import "fmt" const Pi = 3.14 func main() { const World = "世界" fmt.Println("Hello", World) fmt.Println("Happy", Pi, "Day") const Truth = true fmt.Println("Go rules?", Truth) }
一个未指定类型的常量由上下文来决定其类型。
也尝试一下输出 needInt(Big) 吧。
package main
import "fmt"
const (
Big = 1 << 100
Small = Big >> 99
)
func needInt(x int) int { return x*10 + 1 }
func needFloat(x float64) float64 {
return x * 0.1
}
func main() {
fmt.Println(needInt(Small))
fmt.Println(needFloat(Small))
fmt.Println(needFloat(Big))
}