注释
以后就使用行注释,而不用块注释
API网站
https://studygolang.com/pkgdoc
变量
-
golang变量如果没有赋初值,默认会给零值
-
数据类型:函数,管道,接口(这几个还是比较特殊的)
-
整数类型:默认是int类型,可以通过fmt.printf(“%t”,a) 打印出来具体的类型。
-
字符串:字符串一旦赋值了,就不能再改变了
city := “beijing”
city[0] = ‘a’ // 这样是不行的 -
数据类型转化
- 例如var int64 a = int8(b) ,b本身类型没有变化,只是把b的值转为64位,给了a。也很合理
- int64 转化为int8 ,不会报错,但是会溢出处理,失去精度。
-
基本数据类型转化为string
- 可以使用fmt.sprintf("%d",num)这种方式来转化为string
- strconv.Format
-
string转为基本类型
- strconv.ParseInt
- 如果转换失败,会有err,但是还是会给你转为0的(默认值)
-
值类型:
- 值类型都有对应的指针类型。
- 值类型包括:整数,字符串,bool,float,结构体,数组
-
引用类型
- 指针,map,切片,chan
函数
-
golang不支持重载
-
函数可以作为形参数
func method(funcVariable func(a,b int) int ,a,b int) int{
return funcVariable(a,b)
}func tmpMethod(a,b int)int {
return a + b
}func main(){
k := method
k(1,2)
}
自定义类型
自定义的myInt并不是真的就是int类型,他们是不同数据类型。 需要类型转化
type myInt int
var tmp myInt
var tmpInt int
tmp = 20
tmpInt = int(tmp) // 类型转化
自定义函数
//
type myfunc func(i,j int) int
支持可变参数
func method(args... int)
原理就是args 是一个切片
一般我们会在方法中for-range获取它
init函数
go语言中,执行顺序是:全局变量定义、init、main
匿名函数
// 这种方式直接使用匿名函数,只能使用一次
func main(){
func (int i,int j) int{
return i+j
}(10,12)
}
闭包
是一个类, 里面的函数是类的方法,里面的变量就是类的属性,因此下面的第二个计算结果是13
fun add() func(int) int{
var n = 10
return func(x int) int {
return x+n
}
}
case1:
f := add()
f(1) ---> 11
f(2) ---> 13
defer
会把相应的值也入栈
n1 := 1
defer fmt.printf(n1) // 输出1
n1++
fmt.printf(n1) // 输出2
切片
创建一个切片
make([]int,0,3) // 容量为3,目前长度(切片里的元素)为0个
如果是从0 -- len(数组) 则可以写成
slice := 数组[:]
string
string底层是一个byte数组,因此可以通过切片的方式截取string。但是无法改变string内容。
结构体
结构体中的字段在内存中是连续的。
方法
方法绑定在类型上,比如结构体,int,float这些可以绑定。
要和函数区分开来
type student struct{
name string
}
// 这个就是方法
func (s *student) getName(){
}
继承
- 结构体的继承,其实就是把公共的结构体,放到另外一个结构体体中。他也会继承那个内置结构体的方法。-
- a继承b,a可以有和b一样名字的字段,当你访问的时候,如果没有指定,那么默认回事a(就近原则)。
协程
特点:
- 有独立的栈空间
- 共享堆空间
- 调用由用户决定
其他:
协程的结束取决于主进程何时结束。
- MPG模式
M:操作系统的主线程
P:协程执行需要的上下文环境
G:协程
管道
需要make指定容量后才能使用。不能放超过容量的数量。如果管道没有东西了,再取会报错。
var test chan int
chan <- 1
out := <- chan
管道的关闭。close关闭后,不能再往里面写了,但是可以继续读取。
chan的遍历,使用for range来遍历。但是如果管道没有关闭的话,是会报错的。