环境配置
VsCode+go
golang下载链接比较推荐这种压缩包的方式下载解压
配置环境变量
在path里面添加
解释下GOPATH
src存放源代码的目录
pkg编译过后生成的包文件存放目录。
bin编译后生产的可执行文件和go相关的工具,都在此目录。
到现在vscode还是不可以直接F5的还需要安装插件,但是因为墙的原因我们得自己下载。
首先在src下目录创建这样得目录结构
然后在src\golang.org\x这个目录里面用git下载一些东西
git clone https://github.com/golang/mod.git
git clone https://github.com/golang/xerrors.git
git clone https://github.com/golang/tools.git
其他的想下载的也可以一并下载了
git clone http://github.com/golang/lint
git clone http://github.com/golang/net
git clone http://github.com/golang/text
git clone http://github.com/golang/crypto
git clone http://github.com/golang/sys
来到%GOPATH%路径打开cmd安装
go get -u -v github.com/nsf/gocode
go get -u -v github.com/sqs/goreturns
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/newhook/go-symbols
go install golang.org/x/tools/cmd/guru
go install golang.org/x/tools/cmd/gorename
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/lukehoban/go-outline
go get -u -v github.com/derekparker/delve/cmd/dlv
好了到目前为止环境就应该安装完成了
GoLand+go
基础语法
变量
- 第一种,指定变量类型,如果没有初始化,则变量默认为零值。
var str string
- 第二种,根据值自行判定变量类型
var text = "ssssssss" //需要赋值 不能直接var声明
- 第三种,省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误。
intVal,intVal1 := 1,2
- 多变量声明
var x, y int
var ( // 这种因式分解关键字的写法一般用于声明全局变量
a int
b bool
)
var c, d int = 1, 2
var e, f = 123, "hello"
//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"
常量
const identifier [type] = value
[type]可选的
例子:
`const b string = "abc"`
const b = "abc"`
函数定义
- 一般定义
func function_name( [parameter list] ) [return_types] {
函数体
}
//函数
func max(num1, num2 int) (int,int) {
}
- 匿名函数
func getSequence() func() int {
i:=0
return func() int {
i+=1
return i
}
}
- 方法
func (variable_name variable_data_type) function_name() [return_type]{
/* 函数体*/
}
/* 定义结构体 */
type Circle struct {
radius float64
}
func main() {
var c1 Circle
c1.radius = 10.00
fmt.Println("圆的面积 = ", c1.getArea())
}
//该 method 属于 Circle 类型对象中的方法
func (c Circle) getArea() float64 {
//c.radius 即为 Circle 类型对象中的属性
return 3.14 * c.radius * c.radius
}
数组
- 一维数组
//一维数组定义的方法
var balance [10] float32
//初始化赋值
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
//会根据元素的个数来设置数组的大小:
var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
- 二维数组
var arrayName [ x ][ y ] variable_type
a = [3][4]int{
{0, 1, 2, 3} , /* 第一行索引为 0 */
{4, 5, 6, 7} ,/* 第二行索引为 1 */
{8, 9, 10, 11}, /* 第三行索引为 2 */
}
切片
- 切片的意义
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 - 定义切片
//定义切片
var identifier []type
//还可以使用make来定义
var slice1 []type = make([]type, len)
//初始化
//直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3
s :=[] int {1,2,3 }
//初始化切片s,是数组arr的引用
s := arr[startIndex:endIndex]
//将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
s := arr[startIndex:endIndex]
//append和copy
/* 同时添加多个元素 */
arry = append(arry, 2,3,4)
/* 拷贝 numbers 的内容到 numbers1 */
copy(numbers1,numbers)
Range遍历数组
//这是我们使用range去求一个slice的和。使用数组跟这个很类似
nums := []int{2, 3, 4}
sum := 0
for _, num := range nums {
sum += num
}
fmt.Println("sum:", sum)
//range也可以用来枚举Unicode字符串。第一个参数是字符的索引,第二个是字符(Unicode的值)本身。
for i, c := range "go" {
fmt.Println(i, c)
}
map
- 定义map
/* 声明变量,默认 map 是 nil */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
struct
- 结构体字端大小写问题
结构体中参数首字母没有大写时,别的包虽然可以调用这个结构体,但是找不到这个结构体中没有首字母大写的参数。但是这样别人想要json返回的是小写的名字的话,就只能加上tag
- struct绑定方法
type Person struct {
Name string `json:"name"`
Age int
}
func (per Person) GetName() string {
return per.Name
}
func main() {
var p1 Person
p1.Age = 10
p1.Name = "xxxx"
fmt.Println(p1.GetName())
}
- struct工厂模式(构造函数)
应用场景:假设结构体首字母是小写,又希望在别的包里面获得实例。可以设计个类似构造函数的返回结构体指针 - struct继承
type person struct {
Name string `json:"name"`
Age int
}
type student struct {
person //匿名结构体
ID int
}
接口
type Usb interface {
//声明了两个方法
Start()
Stop()
}
type phone struct {
}
func (this phone) Start() {
println("phone start")
}
func (this phone) Stop() {
println("phone end")
}
type Computer struct {
}
//多态
func (this *Computer) work(usb Usb) {
usb.Start()
usb.Stop()
}
func main() {
com := Computer{}
p := phone{}
com.work(p)
}
空接口+断言类型
type Point struct {
x int
y int
}
func main() {
//空接口可以接收任意类型
var a interface{}
var p Point = Point{1, 2}
a = p
var b Point
//类型断言
b = a.(Point)
fmt.Println(b)
}