近来由于部门想统一所有项目的服务端开发,即以后所有新开的项目均采用同一套框架,这样有助于开发人员在参与多项目开发时完成低成本转换。因此,技术方面通过由技术总监指定了一个同事作为该方面的推动者,推动以后新项目的语言与框架的选型。从目前的意见来看,语言选型可能往go语言方面转换。因此本人也开始了go的学习。在学习过程中也发现了很多好玩的东西,权作记录:
一、包的定义与引用
go语言同样可以像java等语言定义包,但go对于包的定义是有严格要求的:
1. 在同一文件夹下只能定义同一个包的代码。如以下结构树中,bubble.go,insert.go等文件的代码定义均使用package test_sort
src/
└── test_sort
├── bubble.go
├── insert.go
├── quick.go
└── selection.go
2. 由于go语言的包的路径检索是通过GOPATH环境变量来指定的,因此即使是自己开发的包,也必须在GOPATH环境变量中指明才能使用。如使用命令:export GOPATH=$GOPATH:/home/haust/go或者在配置文件里添加该环境变量,Linux下在用户根目录下添加上述语句,Windows下在系统环境变量里添加GOPATH变量并定义内容或直接修改现有环境变量
3. 所引用的包的目录必须包含src目录,并且所有的包均包含在src目录下才可以正确引用,否则编译代码时会提示无法找到包的定义
4. 在代码中引用包通过import标识符指定,如果是单个包引用,可以直接使用import "fmt"这种方式,但若是多个包则必须使用:
import ( "fmt" import (
"math/rand") 或者"fmt"
"math/rand"
)
即每个包必须换行引用,否则程序将会报错
二、变量的声明与赋值
先贴几行代码:
var a int a = 3 //a 的先声明后赋值 var b int = 5 //b 在声明的同时赋值 c := 4 //c 声明且赋值在上述的三种声明中,需要特别注意的是赋值符号的区别,对于添加var标志声明的变量和使用:=方式生命的变量不尽相同,后续在介绍数组的使用的时候会给大家展示
三、函数的定义
1. 在go中的包里的函数定义中对外可见函数名首字母必须为大写字母,其他函数名不做要求,详见类型的定义
2. 函数定义必须以func标识符开始
3. 函数的返回值定义在参数列表之后
4. 函数可以有多个返回值,但多个返回值时必须用()括起来
5. 在同一个包内,不能出现同名的函数
如:func Retself(a int) int//单返回值声明
func Retself(a int, b int) (int, int)//多返回值声明
四、类型定义
在go中虽然没有类,但还是同样会有类型定义,该类型的定义方式类同C++的类,但少有区别,如下:
type Rect struct {
width, height int
}
1. 类型的初始化是非常简单的,在类型名的后面使用{}包住初始化列表即可。在go中支持两种方式初始化
(1)具名初始化,如 rect := Rect{width:3, height:4}。这种初始化比较简单也比较容易理解
(2)匿名初始化,如 rect := Rect{3, 4}。这种初始化方式是按照初始化列表和类型的成员一一对应初始化的,即产生的结果是width = 3, height = 4
2. 类型成员函数的定义
在go的类型定义中,同样支持成员函数,以下为例:
func (rect Rect) area() int {
return rect.width * rect.height
}
其调用方式很简单:即 rect.area()调用即可
五、接口定义
定义参考如下:
type Shape interface { perim() int } type Rect struct { width, height int } type Trian struct { a, b, c int } func (r Rect) perim() int { return 2*width + 2*height } func (t Trian) perim() int { return a + b + c }
在使用中也是异常简单的,如下:
func CalcPerim(s Shape) int { return s.perim() } func main() { rect := Rect{3, 4} trian := Trian{1, 2, 3} CalcPerim(rect) CalcPerim(trian) }
有疑问加站长微信联系(非本文作者)