Go语言接受了函数式编程的一些想法,支持匿名函数与闭包,接受了以Erlang语言为代表的面向消息编程思想,支持goroutine和通道,并推荐使用消息而不是共享内存来进行并发编程。总体来说,Go语言是一个非常现代化的语言,精小但非常强大。
学习可参考书籍:老许的《go语言编程》、 老谢的《go web编程》、 雨痕的《go 语言学习笔记》、 golang.org上面的《Effective Go》、《The Go Programming Language Specification》、go标准库和github上众多开源库
Go 语言最主要的特性:
- 自动垃圾回收
- 更丰富的内置类型
- 函数多返回值
- 错误处理
- 匿名函数和闭包
- 类型和接口
- 并发编程
- 反射
- 语言交互性
环境安装
go语言环境下载地址:https://golang.google.cn/dl/
-
下载二进制包:go1.4.linux-amd64.tar.gz。
-
将下载的二进制包解压至 /usr/local目录。
tar -C /usr/local -xzf go1.4.linux-amd64.tar.gz
-
将 /usr/local/go/bin 目录添加至PATH环境变量:
export PATH=$PATH:/usr/local/go/bin
然后就可以国际惯例,helloworld了。
package main import "fmt" func main() { fmt.Println("Hello, World!") }
$go run helloworld.go
going go !
package main
//第一行代码 package main 定义了包名,package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
import "fmt"
//import "fmt" 告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数
const( //常量组 用iota可以实现枚举的功能
A = iota //A =0
B //全局变量不给赋初值的话默认等于上一个,但是iota已经为1 B=1
C="c" //C=”c“
D //D=”c“
E=iota //再调用一次iota,恢复计数 E=4
F //F=5
)
const (
_ = iota // iota = 0,下划线 _ 为占位符,就是充个数而已
KB int64 = 1 << (10 * iota)// iota = 1
MB
GB
TB
)
cost x,y 12,"111" //多个全局变量定义赋值;不填数据类型,会自动根据值来判断
func test(para int) (int, string){
//para 是形参 ,inti,string是返回值类型,go语言允许有多个返回值
d := struct { // 函数内部定义变量可以使用 :=
s string
x int
}{"abc", 100}
//将 Pointer 转换成 uintptr,可变相实现指针运算,指针本身是不支持指针运算的
p := uintptr(unsafe.Pointer(&d)) // *struct -> Pointer -> uintptr
p += unsafe.Offsetof(d.x) // uintptr + offset
p2 := unsafe.Pointer(p) // uintptr -> Pointer
px := (*int)(p2) // Pointer -> *int
*px = 200 // d.x = 200
return 2,"aaa" // 两个返回值
}
func main(){
var s2 string //局部变量若定义了却没使用,编译会报错
var num byte 100 //变量放在类型前
var num_n int =num //会报错,go语言里类型转换都需要显性转换var num_n int =(int) num
var flag int 100
hello:="HELLO, WORLD"
if flag{ //不能这样用,if后面只能判断bool值
fmt.Println("true")
}
he1 := hello[:5] //HELLO
he2 := hello[7:] //WORLD
he3 := hello[1:5] //ELLO 从1开始,不包括5
data, i := [3]int{0, 1, 2}, 0 //多变量一起赋值
i, data[i] = 2, 100 //多变量赋值时,先计算所有相关值,然后再从左到右依次赋值,i=2,data[0]=100
_ , s :=test()
fmt.Println(s)
for _ , r := range hello { //range循环
fmt.Println("%c,",r)
}
}