·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
返回列表 发布新帖

go基础知识汇集

163 2
发表于 2023-7-26 17:56:57 | 查看全部 阅读模式

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Go 语言数据类型包含基础类型和复合类型两大类。
基础数据类型包括:布尔型、整型、浮点型、复数型、字符型、字符串型、错误类型。
复合数据类型包括:指针、数组、切片、字典、通道、结构体、接口。

Go 语言在声明变量时会默认给变量赋个当前类型的空值。

一、_(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。

二、Go之所以会那么简洁,是因为它有一些默认的行为:
• 大写字母开头的变量是可导出的,也就是其它包可以读取的,是公用变量;小写字母开头的就是不可导出的,是私有变量。
• 大写字母开头的函数也是一样,相当于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。

三、make、new操作
make用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。
内建函数new本质上说跟其它语言中的同名函数功能一样:new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。有一点非常重要:new返回指针。
内建函数make(T, args)与new(T)有着不同的功能,make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。本质来讲,导致这三个类型有所不同的原因是指向数据结构的引用在使用前必须被初始化。例如,一个slice,是一个包含指向数据(内部array)的指针、长度和容量的三项描述符;在这些项目被初始化之前,slice为nil。对于slice、map和channel来说,make初始化了内部的数据结构,填充适当的值。
make返回初始化后的(非零)值。

四、总结:slice与array:
1、数组是值类型,可以进行比较,可以将数组用作 map 的映射键。切片为引用类型,都不可以,不能比较,无法作为 map 的映射键。因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。
2、数组有编译安全的检查,可以在早起就避免越界行为。切片是在运行时会出现越界的 panic,阶段不同。
3、数组可以更好地控制内存布局,若拿切片替换,会发现不能直接在带有切片的结构中分配空间,数组可以。
4、数组在访问单个元素时,性能比切片好。
5、数组的长度,是类型的一部分。在特定场景下具有一定的意义。
6、数组是切片的基础,每个数组都可以是一个切片,但并非每个切片都可以是一个数组。如果值是固定大小,可以通过使用数组来获得较小的性能提升(至少节省 slice 头占用的空间)。


五、指针:
指针的零值是nil。任何未初始化的指针都将具有该值nil:当指针没有指向的时候,不能对(*point)进行操作包括读取,否则会报空指针异常。解决方法即给该指针分配一个指向,即初始化一个内存,并把该内存地址赋予指针变量。Go不支持对指针进行算术运算。
我要说一句 收起回复
创宇盾启航版免费网站防御网站加速服务

评论2

CrystαlLv.8 发表于 2023-7-26 17:57:20 | 查看全部
六:什么是 channel 管道

它是一个数据管道,可以往里面写数据,从里面读数据。
channel 是 goroutine 之间数据通信桥梁,而且是线程安全的。
channel 遵循先进先出原则。

写入,读出数据都会加锁。

channel 可以分为 3 种类型:
只读 channel,单向 channel
只写 channel,单向 channel
可读可写 channel
操作nil的channel正常channel已关闭的channel
读 <-ch阻塞成功或阻塞读到零值
写 ch<-阻塞成功或阻塞panic
关闭 close(ch)panic成功panic

channel 还可按是否带有缓冲区分为:
带缓冲区的 channel,定义了缓冲区大小,可以存储多个数据
不带缓冲区的 channel,只能存一个数据,并且只有当该数据被取出才能存下一个数据

不带缓冲区channel示例:
  1. package main
  2. import "fmt"
  3. func main() {
  4.     ch := make(chan int) // 无缓冲的channel
  5.     go unbufferChan(ch)
  6.     for i := 0; i < 5; i++ {
  7.         fmt.Println("receive ", <-ch) // 读出值
  8.     }
  9. }
  10. func unbufferChan(ch chan int) {
  11.     for i := 0; i < 5; i++ {
  12.         fmt.Println("send ", i)
  13.         ch <- i // 写入值
  14.         println("write: ", i)
  15.     }
  16. }
  17. 运行结果如下:
  18. send  0
  19. write:  0
  20. send  1
  21. receive  0
  22. receive  1
  23. write:  1
  24. send  2
  25. write:  2
  26. receive  2
  27. send  3
  28. write:  3
  29. receive  3
  30. send  4
  31. write:  4
  32. receive  4
  33. Program exited.
复制代码
带缓冲区的channel示例:
  1. package main
  2. import (
  3.     "fmt"
  4. )
  5. var c = make(chan int, 5)
  6. func main() {
  7.     go worker(1)
  8.     for i := 1; i < 10; i++ {
  9.         c <- i
  10.         fmt.Println("write: ", i)
  11.     }
  12. }
  13. func worker(id int) {
  14.     for {
  15.         fmt.Println("read: ", <-c)
  16.     }
  17. }
  18. 运行结果:
  19. write:  1
  20. write:  2
  21. write:  3
  22. write:  4
  23. write:  5
  24. write:  6
  25. read:  1
  26. read:  2
  27. read:  3
  28. read:  4
  29. read:  5
  30. read:  6
  31. read:  7
  32. write:  7
  33. write:  8
  34. write:  9
  35. 想一想,为啥没有 read: 8, 9 的值呢?
复制代码
我要说一句 收起回复
CrystαlLv.8 发表于 2023-7-26 17:57:27 | 查看全部
判断 channel 是否关闭

语法:v, ok := <-ch
说明:
ok 为 true,读到数据,管道没有关闭
ok 为 false,管道已关闭,没有数据可读
示例:
  1. package main
  2. import (
  3.     "fmt"
  4. )
  5. func main() {
  6.     ch := make(chan int)
  7.     go test(ch)
  8.     for {
  9.         if v, ok := <-ch; ok {
  10.             fmt.Println("get val: ", v, ok)
  11.         } else {
  12.             break
  13.         }
  14.     }
  15. }
  16. func test(ch chan int) {
  17.     for i := 0; i < 5; i++ {
  18.         ch <- i
  19.         fmt.Println("set val-----", i)
  20.     }
  21.     close(ch)  //如果注释这一句会怎样呢?答案是deadlock
  22. }
  23. 运行结果:
  24. set val----- 0
  25. get val:  0 true
  26. get val:  1 true
  27. set val----- 1
  28. set val----- 2
  29. get val:  2 true
  30. get val:  3 true
  31. set val----- 3
  32. set val----- 4
  33. get val:  4 true
  34. Program exited.
复制代码
range 可以遍历数组,map,字符串,channel等。

一个发送者可以关闭 channel,表明没有任何数据发送给这个 channel 了。接收者也可以测试channel是否关闭,通过 v, ok := <-ch 表达式中的 ok 值来判断 channel 是否关闭。上一节已经说明 ok 为 false 时,表示 channel 没有接收任何数据,它已经关闭了。

注意:仅仅只能是发送者关闭一个 channel,而不能是接收者。给已经关闭的 channel 发送数据会导致 panic。
Note: channels 不是文件,你通常不需要关闭他们。那什么时候需要关闭?当要告诉接收者没有值发送给 channel 了,这时就需要了。
比如终止 range 循环。

当 for range或者无条件的for 遍历 channel 时,如果发送者没有关闭 channel 或在 range 之后关闭,都会导致 deadlock(死锁)。
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

图文热点
创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.217.224.194,GMT+8, 2024-11-17 17:27 , Processed in 0.231293 second(s), 90 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表