命名规范

  1. 对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。
  2. 包命名尽量与目录保持一致,且应全部为小写
  3. 文件命名应为小写,并用下划线分割

包引入

待完善

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 ifelse必须放到}的同一行

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")
}