基本学习
查看文档 go doc builtin.方法名
输入时如果有空格 需要用bufio.NewReader(os.Stdin)去读
数组扩容的问题
新容量 cap 旧容量 old.cap 最终容量 newcap if cap > 2*old.cap newcap=cap else if old.cap<1042 newcap= 2*old.cap else if old.cap>=1042 newcap= old.cap(1+1/4) else newcap溢出 newcap=cap
切片不保存具体的值
// make([]int ,5,10) 创建切片,长度为5,容量10,此时为 [0 0 0 0 0 0】 a1 :=[]int{1,2,3} a2 :=a1 var a3 = make([]int ,3,3) copy(a3,a1) fmt.Println(a1,a2,a3) a1[0]=100 fmt.Println(a1,a2,a3) a2 = append(a1[:1],a1[2:]...) //取得时候改变了第二个位置的参数变为了3 fmt.Println(a1) // int[1 2 3] [1 2 3] [1 2 3] //[100 2 3] [100 2 3] [1 2 3] //[100 3 3] 修改了底层数组才能做到这种情况
& 取值 *根据地址取值
集合使用
字符串
s1:="Hello沙河" var count int for _,c :=range s1{ if unicode.Is(unicode.Han,c) { count++ } } println(count)
make和new的区别
1、make和new都是用来申请内存的
2、new很少用,一般用来给基本数据类型申请内存、string\int...
3、make是用来给
slice
map
chan
申请内存的,make函数返回的是对应的这三个类型本身map
map[key]vlaue
m1:=make(map[string]int,10) m1["梦想"] =9 println(m1) println("获取value:",m1["梦想"]) value,ok :=m1["理想"] if !ok { println("查无次key") }else{ println(value) } for k,v :=range m1{ println(k,v) } m1["理想"] =10 delete(m1,"理想") println(m1) /* map[梦想:9] 获取value: 9 查无次key 梦想 9 map[梦想:9] */
函数
使用命名返回值可以省略不写
func 函数名 (参数)(返回值){ return 表达式 } defer 把它后面的语句延迟到函数即将返回的时候再执行 return的顺序 1、返回值 2、defer 3、ret指令
闭包 高阶用法
panic 抛异常 recover捕获异常
fmt标准库
%#v 查看详细参数
%v 按照值原样输出
%p 指针
%c 字符
%T查看类型
%U unicode参数
type后面跟的是类型
有点类似java的类 创造结构体
type preson struct { name string age int gender string hobby []string }
对象转json字符串
import "encoding/json" p1 :=student{ id: 1, name: "sd", } b,error :=json.Marshal(p1) if error!=nil{ fmt.Println(error) } fmt.Printf("%#v\n",string(b))
import "encoding/json" // 打开文件 type presion struct { Name string `json:"name"` Age int `json:"age"` } func main() { str :=`{"name":"zhou","age":14}` var p presion json.Unmarshal([]byte(str),&p) println(p.Name,p.Age) }
type接口类型
type speaker interface
文件操作 "io/ioutil"
import "os" // 打开文件 func main() { fileObj,err:=os.Open("./aug_21.go") if err!=nil { fmt.Println("Open file failed,err:%v",err) } //关闭文件 defer fileObj.Close() //读文件 var temp [1024]byte n,err :=fileObj.Read(temp[:]) if err!=nil { fmt.Println("Open file failed,err:%v",err) } fmt.Println(n) fmt.Println(string(temp[:n])) }
日志
logger
time包
time.Now()获取时间对象
time.LoadLocation ()设置时区
ini配置文件设置
[mysql] address=10.20.30.40 port=3306 username=root password=rootroot # redis [redis] host=10.20.30.40 port=6379 password=root database=root
并发
goroutine 栈不是固定的,按需变化 最大1G
sync.WaitGroup 同步
随机库 math/rand
channel
1、发送 ch1<-1
2、接受 <-ch1
3、关闭close()
import ( "fmt" "sync" ) var a[]int var b chan int //指定通道类型 var wg sync.WaitGroup func noBufChannel () { fmt.Println(b) b=make(chan int)//不带缓存区通道的初始化 wg.Add(1) go func() { defer wg.Done() <-b }() b <- 10 fmt.Println(b) wg.Wait() } func main() { b=make(chan int,16)//带缓存区通道的初始化 fmt.Println(b) }