命名规范
- 对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。
- 包命名尽量与目录保持一致,且应全部为小写
- 文件命名应为小写,并用下划线分割
包引入
待完善
import (
"fmt"
"math/rand"
)
使用import引入包,处于gomodule下时包可以放在非GOPATH路径下,而处于gopath模式下时项目包必须放到GOPATH路径下。
详细可参考浅谈GoPath和Go Modules包管理
GO类型说明
与其他类C语言不同,Go语言的类型声明符号放到名字的后面了:
如以下C语法:
int a;
int f1()
{
}
在Go语言中是这样的:
var a int
func f1() int{
}
官方解释称放到后面是为了在复杂情况时更易读:Go’s Declaration Syntax
多值返回
go语言支持类似Python的函数多值返回如下:
package main
import "fmt"
func swap(a ,b int)(int,int){
return b,a
}
func main() {
fmt.Println(swap(1,2))
}
返回值命名
go语言可给返回值命名,这样就可以隐式的返回变量:
func returnName()(s string,a int){
s="aaa"
a=1
return
}
func main() {
fmt.Println(returnName())
}
变量声明
go 使用var
关键字来声明关键词,如var c=2 int
相同类型变量可以简写如var a,b,c=1,2,"hello"
上面的代码会自动识别abc的类型。
在函数体内部
可用k := 3
替换类型明确的var声明
GO类型
Go 内置了以下基本类型:
- 布尔
- bool
- 字符串
- string
- 整数
- int
- int8
- int16
- int32
- int64
- uint
- uint8
- uint16
- uint32
- uint64
- 字节
- byte ,uint8 的别名
- Unicode
- rune ,int32 的别名
- 浮点
- float32
- float64
- 复数
- complex64
- complex128
零值
- 数值类型为 0
- 布尔类型为 false
- 字符串为 “”(空字符串)
类型转化
var f float64 = math.Sqrt(float64(x*x + y*y))
var z uint = uint(f)
与C不同的是,go不能自动转换,如删除上面的uint,会导致报错
类型推导
当右值声明了类型时,新变量的类型与其相同:
var i int
j := i // j 也是一个 int
不过当右边包含未指明类型的数值常量时,新变量的类型就可能是 int, float64 或 complex128 了,这取决于常量的精度:
i := 42 // int
f := 3.142 // float64
g := 0.867 + 0.5i // complex128
常量
使用const关键字声明如const Pi=3.14
也可以同时声明多个:
const (
Pi=3.14
N=10
)
循环
go仅有for一种循环,与C语言类似,没有小括号,初始语句与后置语句是可省略的(这样就当做while循环来使用了甚至可以省略掉前后的分号
)
for i := 0; i < 10; i++ {
sum += i
}
选择结构
if语句
if语句同样不需要加括号,但相比c语言,go支持在条件表达式执行前执行一个简单的语句如下:
if v := math.Pow(x, n); v < lim {
return v
}
i:=2
if i>0{
i=2
}else if i>2{
i=3
} else {
i=4
}
注意else if
和else
必须放到}
的同一行
case语句
switch os := runtime.GOOS; os {
case "darwin":
fmt.Println("OS X.")
case "linux":
fmt.Println("Linux.")
default:
// freebsd, openbsd,
// plan9, windows...
fmt.Printf("%s.\n", os)
}
还可以使用没有条件的case语句可以使得多条件更简洁清晰:
switch {
case t.Hour() < 12:
fmt.Println("Good morning!")
case t.Hour() < 17:
fmt.Println("Good afternoon.")
default:
fmt.Println("Good evening.")
}
defer 语句
defer语句可以让函数调用推迟到整个函数返回后再执行
如:
package main
import "fmt"
func main() {
defer fmt.Println("world")
fmt.Println("hello")
}
所以推迟的函数调用会被放入一个栈中,当函数返回时,按照后进先出顺序依次调用。
package main
import "fmt"
func main() {
fmt.Println("counting")
for i := 0; i < 10; i++ {
defer fmt.Println(i)
}
fmt.Println("done")
}