- go.mod是Golang1.11版本新引入的官方包管理工具,在Go语言1.13版本之后不再需要设置环境变量。通过设置GO111MODULES可以开启或关闭go module工具
go go env -w GO111MODULE="on" go mod init demo
- Golang运行时三大件:
- 内存分配器
- 垃圾回收器
- Goroutine调度
源文件
- 源码文件使用UTF-8编码,对Unicode支持良好
- 每个源文件都属于包的一部分,在文件头部用package声明所属包名称。
- 入口函数main没有参数,且必须放在main包中。
- 用import导入标准库或第三方包。
变量
- var 定义变量
- x := 10
- 支持类型推断
- 编译器确保变量总是被初始化为零值,避免出现意外状况。
表达式
Go仅有三种流控制语句,与大多数语言相比,都可称得上简单。
- if
- switch
- for
函数
- 函数可定义多个返回值,甚至对其命名。
- 函数是第一类型,可作为参数或返回值。
- 用defer定义延迟调用,无论函数是否出错,它都确保结束前被调用。(用于释放资源, 解除锁定, 或执行一些清理工作)
方法
- 可以为当前包内的任意类型定义方法。
package main
type X int
func(x*X)inc() { // 名称前的参数称作receiver,作用类似python self
*x++
}
func main() {
var x X
x.inc()
println(x)
}
- 还可直接调用匿名字段的方法,这种方式可实现与继承类似的功能。
package main
import(
"fmt"
)
type user struct{
name string
age byte
}
func(u user)ToString()string{
return fmt.Sprintf("%+v",u)
}
type manager struct{
user
title string
}
func main() {
var m manager
m.name= "Tom"
m.age=29
println(m.ToString()) // 调用user.ToString()
}
go语言中函数与方法重要的区别:
1.调用方式不一样
函数的调用方式:函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)
2.对于普通函数,接受者为值类型时候,不能传递指针类型
func (p Person) Test(){
p.Name="json"
}
func (p *Person) Test01(){
p.Name="tom"
}
重要点:
1.不管调用形式如何,真正决定是值拷贝还是地址拷贝的,
看这个方法是和哪个类型绑定
2.方法如果是和值类型绑定,如(p Person),则是值拷贝,
如果是和指针类型绑定,如(p *Person)则是地址拷贝。
数据
- 切片(slice)可实现类似动态数组的功能。
- 将字典(map)类型内置,可直接从运行时层面获得性能优化。
- 将字典(map)类型内置,可直接从运行时层面获得性能优化。
package main
import(
"fmt"
)
type user struct{ // 结构体类型
name string
age byte
}
type manager struct{
user // 匿名嵌入其他类型
title string
}
func main() {
var m manager
m.name= "Tom" // 直接访问匿名字段的成员
m.age=29
m.title= "CTO"
fmt.Println(m)
}
接口
go的接口是动态的,即一个数据结构无需事先声明实现了某接口。对比java等静态语言,需要明确声明实现了哪些接口。go也对接口的实现进行静态检查,不过,这种类似于javascript prototype的面向对象机制,也许给IDE带来了不小的困难?
go的接口命名规则似乎很有道理:Reader,Emitter等以er结尾的单词,值得其他语言借鉴。
并发
goroutines & channel是go的宝贵资产,极大方便了并发编程和线程通讯。
网友评论