GO语言笔记(八) | 青训营

65 阅读3分钟

GO的网络包

我看得书有一些老了,很多东西都在一代代的版本更新之下发生了被弃用等现象,比如rand包如果只是想要生成随机值那不需要再次传入随机种子就可以了,如果想要在测试时使用固定可重现的序列那可以使用全新的rand.New(rand.NowSource(seed))来生成本地随机序列。

具体的我找到了一篇文章,给各位一个参考:GO1.20稳定版之变化

没必要现在就去读,可以在把之前的基础学完之后再去了解新特性。

同时又随着GO开源贡献者的努力,我们出现了很多的第三方包,它们其中不乏有超越官方之处。

还有一个忘记说的地方,当我们对map映射进行操作的时候,使用range的时候前面可以只放一个参数接收数据,这样获得的就是

那其实现在大部分的数据类型已经简简单单地说过了,那么就要进入到使用和深入了解当中了。

我们可以通过net/http包当中的Get方法来进行http请求,它会返回两个值,这个通过注释可以看到,一个是返回的结构体,另外一个是如果出错返回的参数。

当然要记得如果读取某些信息,在使用完之后要记得关闭响应体,确保不会出现资源泄漏。

GO似乎很看重并发编程,所以对其支持很好。下面来简单了解一下在并发过程中可能会遇到的一些代码:

  • 首先,goroutine是绕不开的,它是一种函数并发执行的方式,其中channel是这些协程之间传递信息的通道,可以用来传递参数。main函数本身听说也是运行在一个goroutine里面的。
  • 我们可以使用make()内置函数来创建一个传递某种类型参数的channel
  • 我们可以使用go关键字来创建一个goroutine

io包里面还有一个Discard的变量,可以向里面写入不需要的数据。其描述是这样的:Discard is a Writer on which all Write calls succeed without doing anything.

var ch=make(chan stringh)//这个make返回的是引用,只是用于创建切片、map(称为索引或者映射,也就是键值存储)、channel。
ch <- fmt.Sprintf("%.2fs  %7d  %s", secs, nbytes, url)

我们可以通过以上的写法来向通道当中传入字符串,因为Sprintf返回的就是一个字符串类型的东西。

值得一说的是,channel是为goroutine而设计的,他当然可以被使用在非协程情况下,不过很容易发送消息过程被阻塞导致死锁。

我们使用<-ch的写法来从管道当中读取数据。

既然说到这里了,我想到了某个学习网站上面的每日面试一题,在这里放出来考考大家:new() 与 make() 的区别


在这里公布答案:image-20230829205722759