src := "abcde"
src[0] = "c"
全局变量: 在函数外部定义的变量,称为全局变量;
作用域:同一个包内任何地方;
全局变量,首字母大写,可以跨包访问;
小写,则只可以在本包内访问;
全局变量,不能使用:=(短变量)进行赋值创建,会出现编译异常;
局部变量: 定义在{}里面的变量为局部变量;
全局变量只能通过var声明;
var和const :变量和常量的声明var varName type 或者 varName : = valuepackage and import: 导入func: 用于定义函数和方法return :用于从函数返回defer someCode :在函数退出之前执行go : 用于并行select 用于选择不同类型的通讯interface 用于定义接口struct 用于定义抽象数据类型break、case、continue、for、fallthrough、else、if、switch、goto、default 流程控制chan用于channel通讯type用于声明自定义类型map用于声明map类型数据range用于读取slice、map、channel数据go语言内置函数 delete
内置函数 delete 只能删除 map,参见源码:
func delete(m map[Type]Type1, key Type)
s=append(s[i:],s[i+1:]) (append可以对切片进行初始化操作)由panic引发异常以后,程序停止执行,然后调用延迟函数(defer),就像程序正常退出一样。另外recover也是要写在延迟函数中的,如果发生异常延迟函数就不执行了,那就永远无法recover了。
异常发生后,panic之前的defer函数会被执行,但是panic之后的defer函数并不会被执行
go语言channel
go语言的匿名函数定义
// 赋值给变量执行
a := func() {
println("assign to var and execute")
}
a()
// 直接执行
func() {
println("direct execute")
}()
go语言中interface{}
runtime.eface 是可以接收任意类型的,本身也是具有确定类型的go语言中有哪些类型可以自定义方法->(除了指针都可以)
定义方法必须指定方法的接收者。方法的接收者可以是内置类型、自定义结构体,不能是指针(比如:&p)
几乎所有类型包括内置类型,均可以自定义方法。除了指针。
func (a *Integer) Multi(b Integer){}
go语言中传递参数只有值传递,没有引用传递(详情查看GO语言圣经)
package main
import (
"sync"
"sync/atomic"
)
func main() {
var wg sync.WaitGroup
ans := int64(0)
for i := 0; i < 3; i++ {
wg.Add(1)
go newGoRoutine(wg, &ans)
}
wg.Wait()
}
func newGoRoutine(wg sync.WaitGroup, i *int64) {
defer wg.Done()
atomic.AddInt64(i, 1)
return
}
sync.Waitgroup 里面有 noCopy 结构,不应该使用值拷贝,只能使用指针传递。
函数newGoRoutine 的第一个传参类型为sync.WaitGroup,传入的值并不是原先main函数中的值,而是该参数的值拷贝。最终只是将函数内部的wg进行了关闭,而main函数中的wg会堵塞造成死锁。
关于main函数(可执行程序的执行起点)
Main函数和init函数都没有参数和返回值的定义
main函数所在的包必须为main包
main函数中可以使用flag包来获取和解析命令行参数
go语言channel
无缓冲的channel是同步的,而有缓冲的channel是非同步的
比如
c1:=make(chan int) 无缓冲
c2:=make(chan int,1) 有缓冲
c1<-1
无缓冲的 不仅仅是 向 c1 通道放 1 而是 一直要有别的携程 <-c1 接手了 这个参数,那么c1<-1才会继续下去,要不然就一直阻塞着
而 c2<-1 则不会阻塞,因为缓冲大小是1 只有当 放第二个值的时候 第一个还没被人拿走,这时候才会阻塞。
打个比喻
无缓冲的 就是一个送信人去你家门口送信 ,你不在家 他不走,你一定要接下信,他才会走。
无缓冲保证信能到你手上
有缓冲的 就是一个送信人去你家仍到你家的信箱 转身就走 ,除非你的信箱满了 他必须等信箱空下来。
有缓冲的 保证 信能进你家的邮箱
基础类型,基础类型又分为三种
复合类型,通过组合简单的类型,来表达更加复杂的数据结构
引用类型,凡是能表示为nil的都为引用类型(因为其内部构成都有一个指针)
接口类型,对其它类型行为的抽象和概括
time.Duration这样命名的基础类型,但是许多常量并没有一个明确的基础类型。编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算;你可以认为至少有256bit的运算精度。这里有六种未明确类型的常量类型,分别是无类型的布尔型、无类型的整数、无类型的字符、无类型的浮点数、无类型的复数、无类型的字符串。go语言切片
append也可以进行切片初始化操作go语言Json序列化操作
select和switch语句
同步锁,RW读写锁
CGO
Go语言中取反操作
^x 来进行取反Go语言中int和uint取值范围
自定义方法
几乎所有类型包括内置类型,均可以自定义方法。除了指针。
func (a *Integer) Multi(b Integer){}
关于函数返回值的错误设计
golong垃圾回收机制