Go 语言数据类型 Go 语言教程

Go 语言数据类型


peter 发布于 2024-4-16 20:38

Go 语言基础语法 Go 语言教程

Go 语言基础语法


peter 发布于 2024-4-11 20:27

peter 发布于 2024-4-11 20:23

为什么很多第三方接口,都改成了基于http,直接传递json数据的方式来代替webservice?

问题:
曾经不同系统间交互问题时,总是优先考虑webserivce,现在看到除了一些老牌的公司,比如 amazonk 对众的接口还是webservice的方 式,其他很多国内新项目的接口都开始转向直接传 JSON 的方式。我知道的优势之一,就是webservice的消息体肯定比json这种方式要大。请问, 除此之外,设计这些对众接口的时候,还有什么其他的考虑吗?

回答:
这实际上是三个问题,从WebService到今天流行的RESTful API(JSON ) over HTTP ,经历了数次变革。

1 WebService有很多协议,为什么HTTP比较流行?
WebService是个很重型的规范,它的应用协议是SOAP(简单对象访问协议),它所依赖的下层通信方式不单单是HTTP,也有SOAP over SMTP, SOAP over TCP ,由于 HTTP 协议群众基础广,开发调试方便,所以,成了WebService中最为流行的方式。

甚至很多公司在内网通信,也用 HTTP 来做,比如,应用调用搜索引擎,Solr就是一个例子。

但 HTTP 也是 TCP 上性能比较差的协议,因为HTTP是基于 TCP 的,有3次握手,再加上HTTP是个文本传输协议(虽然也可以传二进制的附件, 但业务逻辑还是文本用的多),又有很多复杂的HEADER。所以人们发明了一些更高效的通信协议来做远程调用,比如ACE、ICE、Corba、淘宝的 HSF,但这是后话了,不展开细说。你只要知道, HTTP 之所以流行,乃是简单易用群众基础广的结果。

2 WebService为什么不如RESTful API流行
WebService诞生十几年了,最初是IBM、微软比较热心在推,一直也不温不火。倒是XML-RPC, RESTful以及比RESTful还要简陋的远程调用方式后来居上。感觉是不是有点像民间的Spring干掉官方的EJB?

究其原因,还是WebService实在太笨重了,SOAP信封犹如婆娘的裹脚布,又臭又长,广大开发人员是叔可忍嫂不能忍,于是就有了简化版的, 叫XML-RPC,后来伴随着Web2.0流行,RESTful独领风骚。我在10年前做过一个产品,纯PHP+JS,标准的WebService,连 WSDL我都要专门写个PHP程序来生成,还好只是我一个人开发,要是团队协作,我早就被骂得不成人形了。

再后来,连RESTful都被嫌弃了,大伙儿干脆连PUT、DELETE都懒得用,直接用GET和POST。

同时,我得说,这只是在互联网领域,大部分企业的业务逻辑相对简单,同时工期又变态的短(就像大部分互联网创业公司用糙快猛的PHP,而不用相对严 谨的Java一样)。在某些业务复杂,稳定性和正确性要求高的领域(如ERP、电商、支付),WebService还有是用武之地的。

3 为什么JSON比XML流行
还是易用性,JSON的可读性比XML强几条长安街,解析规则也简单许多。 XML 解析的时候规则太多了,动不动就非法字符,动不动就抛异常。这对追求高开发速度和低开发门槛的企业来说,是个致命伤。

JSON的缺点是数据类型支持较少,且不精确。比方说:

{"price":12580}

在json里,你无法知道这个价格是int, float还是double。

所以,如上面第二条所述,在一些业务要求较高的领域,还是XML更合适。

最后说一下性能, JSON 的性能高于XML,除此之外,基于 XML 和 HTTP 的 WebService , 基于 JSON 的RESTful API ,并没有性能差异。

XML 性能糟糕到什么地步呢,有一种专门的CPU叫做XML Accelerator,专门为XML解析提供硬件加速。


peter 发布于 2024-1-12 13:41

Windows上安装Go语言开发包

下载Go语言开发包
大家可以在Go语言官网(https://golang.google.cn/dl/)下载 Windows 系统下的Go语言开发包,如下图所示。

这里我们下载的是 64 位的开发包,如果读者的电脑是 32 位系统的话,则需要下载 32 位的开发包,在上图所示页面中向下滚动即可找到 32 位开发包的下载地址,如下图所示。

注意:下载 Windows 版本的Go语言开发包时尽量选择 MSI 格式,因为它可以直接安装到系统,不需要额外的操作。注意:下载 Windows 版本的Go语言开发包时尽量选择 MSI 格式,因为它可以直接安装到系统,不需要额外的操作。

安装Go语言开发包
双击我们下载好的Go语言开发包即可启动安装程序,如下图所示,这是Go语言的用户许可协议,无需管它,直接勾选“I accept ...”然后点击“Next”即可。

在 Windows 系统下Go语言开发包会默认安装到 C 盘的 Go 目录下,推荐在这个目录下安装,使用起来较为方便。当然,你也可以选择其他的安装目录,确认无误后点击“Next”,如下图所示:

Go语言开发包的安装没有其他需要设置的选项,点击“Install”即可开始安装,如下图所示:

http://c.biancheng.net/uploads/allimg/191105/4-19110511063L26.gif

等待程序完成安装,然后点击“Finish”退出安装程序。

安装完成后,在我们所设置的安装目录下将生成一些目录和文件,如下图所示:

这个目录的结构遵守 GOPATH 规则,后面的章节会提到这个概念。目录中各个文件夹的含义如下表所示。

Go 开发包的安装目录的功能及说明

目录名 说明
api 每个版本的 api 变更差异
bin go 源码包编译出的编译器(go)、文档工具(godoc)、格式化工具(gofmt)
doc 英文版的 Go 文档
lib 引用的一些库文件
misc 杂项用途的文件,例如 Android 平台的编译、git 的提交钩子等
pkg Windows 平台编译好的中间文件
src 标准库的源码
test 测试用例

开发时,无须关注这些目录。如果读者希望深度了解底层原理,可以通过上面的介绍继续探索。
设置环境变量
开发包安装完成后,我们还需要配置一下GOPATH 环境变量,之后才可以使用Go语言进行开发。GOPATH 是一个路径,用来存放开发中需要用到的代码包。

在桌面或者资源管理器右键“此电脑”(或者“我的电脑”)→“属性”→“高级系统设置”→“环境变量”,如下图所示。

在弹出的菜单里找到 GOPATH 对应的选项点击编辑之后就可以修改了,没有的话可以选择新建,并将变量名填写为 GOPATH,变量值设置为任意目录均可(尽量选择空目录),例如 D:\Go。

提示:填写完成后,每个打开的窗口都需要点击“确定”来保存设置。

其它的环境变量安装包均会进行自动设置。在默认情况下,Go 将会被安装在目录 c:\go 下,但如果你在安装过程中修改安装目录,则可能需要手动修改所有的环境变量的值。

环境变量设置好后,可以通过go env 命令来进行测试。

C:\Users\Administrator>go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Administrator\AppData\Local\go-build
set GOENV=C:\Users\Administrator\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\Administrator\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
. . .

上面只显示了部分结果,如果执行go env 命令后,出现类似上面的结果,说明我们的Go开发包已经安装成功了。


peter 发布于 2022-12-9 09:29

openAi注册

想要好好的使用openAi,得先注册一个账号

但是前提条件是你得能正常访问谷歌.

然后到这个网站上去注册:

https://beta.openai.com/signup

首先是邮件认证,这个好说。

但是接下来需要验证手机号,你会发现选了我们的 country 之后...

【腾讯云】年度爆款2核2G4M云服务器118元/年,新老用户同享

哦豁,暂时不支持:

这里必须要有一个国外的手机号才行,确实有亿点点难度。

但是你要相信,没有什么困难能难住沙雕网友。

很快,我就看到了网友们给到了这样的一个网站:

sms-activate.org

第一步先注册。

第二步选择国家和 openAI 服务:

可以看零售价格是 10.5 ₽。

₽,是毛子币的符号,大概价值 1.2 元人民币:

第三步,充值。

我这边选择了 0.2 美元的充值金额:

通过支付宝支付了 1.47 元:

接着你就可以获取到一个手机号,拿着这个手机号,填到之前要求验证号码的地方,记得去掉号码前面的 91,然后获取到你的验证码:

接下来你就会到这个界面,代表注册成功:

最后,访问这个网站:

https://chat.openai.com/auth/login

输入刚刚注册的邮箱和密码,然后你会给你一些温馨提示,说对话会被收集,被审查,用来改进系统,所以不要分享敏感信息:

当你看到这个界面的时候,恭喜你,可以和一个牛逼的人工智能进行“对话”了:


peter 发布于 2022-12-9 09:29

golang框架gin的优点

  1. 快速:基于Radix树的路由,性能非常强大。
  2. 支持中间件:内置许多中间件,如Logger,Gzip,Authorization等。
  3. 崩溃恢复:可以捕捉panic引发的程序崩溃,使Web服务可以一直运行。
  4. JSON验证:可以验证请求中JSON数据格式。
  5. 多种数据渲染方式:支持HTML、JSON、YAML、XML等数据格式的响应。
  6. 扩展性:非常简单扩展中间件。

peter 发布于 2022-12-7 09:14

go语言中的map底层原理分析

map 是一种key-value的键值对存储结构,其中key不能重复,底层用hash表存储。

在go的map实现中,它的底层结构体是hmap,hmap里维护着若干个bucket数组 (即桶数组)。

Bucket数组中每个元素都是bmap结构,也即每个bucket(桶)都是bmap结构,【ps:后文为了语义一致,和方便理解,就不再提bmap了,统一叫作桶】 每个桶中保存了8个kv对,如果8个满了,又来了一个key落在了这个桶里,会使用overflow连接下一个桶(溢出桶)。

划重点:
指向桶数组的指针

指向旧桶数组的指针

B 2^B个桶的数量

溢出桶的数量

储存溢出桶的extra


peter 发布于 2022-12-7 09:09

golang的内存管理机制

golang内存管理基本是参考tcmalloc来进行的。go内存管理本质上是一个内存池,只不过内部做了很多优化:自动伸缩内存池大小,合理的切割内存块。

一些基本概念:
页Page:一块8K大小的内存空间。Go向操作系统申请和释放内存都是以页为单位的。
span : 内存块,一个或多个连续的 page 组成一个 span 。如果把 page 比喻成工人, span 可看成是小队,工人被分成若干个队伍,不同的队伍干不同的活。
sizeclass : 空间规格,每个 span 都带有一个 sizeclass ,标记着该 span 中的 page 应该如何使用。使用上面的比喻,就是 sizeclass 标志着 span 是一个什么样的队伍。
object : 对象,用来存储一个变量数据内存空间,一个 span 在初始化时,会被切割成一堆等大的 object 。假设 object 的大小是 16B , span 大小是 8K ,那么就会把 span 中的 page 就会被初始化 8K / 16B = 512 个 object 。所谓内存分配,就是分配一个 object 出去。

mheap
一开始go从操作系统索取一大块内存作为内存池,并放在一个叫mheap的内存池进行管理,mheap将一整块内存切割为不同的区域,并将一部分内存切割为合适的大小。

mheap.spans :用来存储 page 和 span 信息,比如一个 span 的起始地址是多少,有几个 page,已使用了多大等等。

mheap.bitmap 存储着各个 span 中对象的标记信息,比如对象是否可回收等等。

mheap.arena_start : 将要分配给应用程序使用的空间。

mcentral
用途相同的span会以链表的形式组织在一起存放在mcentral中。这里用途用sizeclass来表示,就是该span存储哪种大小的对象。

找到合适的 span 后,会从中取一个 object 返回给上层使用。

mcache
为了提高内存并发申请效率,加入缓存层mcache。每一个mcache和处理器P对应。Go申请内存首先从P的mcache中分配,如果没有可用的span再从mcentral中获取。


peter 发布于 2022-12-6 23:12

go语言有函数在main之前执行吗?

go语言的init函数在main函数之前执行,它有如下特点:

func init() {
    ...
}

init函数非常特殊:

初始化不能采用初始化表达式初始化的变量;
程序运行前执行注册
实现sync.Once功能
不能被其它函数调用
init函数没有入口参数和返回值:
每个包可以有多个init函数,每个源文件也可以有多个init函数。
同一个包的init执行顺序,golang没有明确定义,编程时要注意程序不要依赖这个执行顺序。
不同包的init函数按照包导入的依赖关系决定执行顺序。


peter 发布于 2022-12-6 23:10