go 圣经
vd_vd
简单粗暴
展开
-
slice
因为slice值包含指向第一个sllice元素的指针,传入的slice允许在函数内部修改底层数组的元素。slice不能比较,数组可以比较:数组的类型和数值都相同的时候才可以相等。一个零值的slice等于nil,一个nil值的slice并没有底层数组。一个nil值的slice的行为和其他任意0长度的slice是一样的。为什么向函数传递slice允许在函数内部修改底层数组的元素?复制的slice只是对底层的数组创建了一个新的slice别名。slice顶部位置对应slice的最后一个位置。原创 2024-04-28 09:44:13 · 155 阅读 · 0 评论 -
Map....
这是因为map可能随着元素数量增长而重新分配更大的内存空间,从而导致之前的地址无效。和slice一样,map之间不能进行相等比较,唯一的例外是和nil进行比较。map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。map中的元素并不是一个变量,所以我们不能对map中的元素进行取址操作。map中的元素不是一个变量,我们不要能对它进行取址操作。如果key不存在,得到value对应类型的零值。如果key存在,得到key对应的value。使用内置的delete函数可以删除元素。原创 2024-04-28 09:41:24 · 143 阅读 · 0 评论 -
结构体..
set不包含键值对,而且每个值在set中都是唯一的,set的主要目的是知道这个元素是不是这个集合的一部分。一个命名为s的结构体不能包含s类型的成员,但能包含*s指针类型的成员,这可以让我们创建递归的数据类型。有些时候我们会嵌入匿名结构体的原因是此结构体中的方法我们可以使用。如果考虑效率的话,较大的结构体通常会用指针的方式传入和返回。如果结构体的成员是可以比较的,那么结构体也是可以直接比较的。如果要在函数内部修改结构体成员,用指针传入是必须的。原创 2024-04-28 09:40:43 · 117 阅读 · 0 评论 -
Json(标题)
将结构体转变为Json的过程叫编组,编组是通过json.Marshal函数完成的。json的对象类型可以用于编码Go语言中的map类型和结构体。Go语言对这些标准格式和编码都有良好的支持。json可以表示字符串,数字,布尔值和对象。类似的还有XML,ASN.1。是和在编译阶段关联到该成员的。原创 2024-04-28 09:39:35 · 319 阅读 · 0 评论 -
文本和HTML模板
这里是将Title作为prinf的参数,基于fmt.Sprintf实现的内置函数。可以简化这个err的处理,使用这个函数可以不需要管返回的err。模板语言里包含通过选择的结构体的成员,调用函数或方法。操作符表示将前一个表达式的结果作为后一个函数的输入。一个模板可能是一个文件或者是一个字符串。对于action部分将触发其他的行为。前面是输入的参数,后面是输出。是一个或多个由双括号组成的。我们呢来通过这个模板来分析。它接受一个模板和一个err。第一行是打印匹配到的总数。对应一个循环action。原创 2024-04-28 09:36:45 · 169 阅读 · 0 评论 -
函数(仅仅是将自己不会的写上去)
对squares的一次调用会生成一个局部变量x并返回一个匿名函数,中间的过程我们对外部的x进行了访问。函数值不仅仅是一串代码,还记录了状态。所以说函数值属于引用类型。函数值也就不可以比较了。我们将函数值成为闭包。原创 2024-04-28 09:36:04 · 74 阅读 · 0 评论 -
第二章 程序结构
抛开技术问题不说,基本的实现思路是,从每个包级的变量和每个当前运行函数的每一个局部变量开始,通过指针的访问路径遍历,是否能找到该变量。如果不存在这样的访问路径,说明该变量不可达,这样的变量也就没有存在的意义。指针是实现flag包的关键技术,它使用命令行参数来设置对应变量 的值,而这些命令行的标志参数可能会零散分布在整个程序中。新命名类型提供了一个方法,用来分割不同概念的类型,即使他们呢底层类型相同也是不兼容的。如果将指针作为参数调用函数,可以在函数中通过该指针来更新变量的值。通过指针来更新变量的值。原创 2024-04-28 09:34:22 · 211 阅读 · 0 评论 -
第一章 入门
go的指针没有指针运算,不能进行加减操作,这是指指针本身的地址值,不是*px := 1p := &x*p = 2。原创 2024-04-28 09:33:29 · 246 阅读 · 0 评论 -
panic
panic异常发生的时候,程序会中断运行,并立即执行该goroutine中的defer函数。对于大部分漏洞,应尽量避免程序的崩溃,直接使用err(go提供的错误机制)panic函数接受任何值作为参数。原创 2024-04-28 09:32:05 · 83 阅读 · 0 评论 -
Recover捕获异常
我们很难完全遵守规范,在net/http包中提供的web服务器,我们不应该因为一个handler函数的问题而终止整个gorouitne,这里我们需要使用recover。下面这个函数中,如果某个异常出现,我们不会选择让解析器崩溃,而是将panic异常当作普通的解析错误,并附加额外消息提醒用户报告此错误。我们观察上面的defer函数,p是recover的错误信息,我们将panic value添加到了err中。在panic后面,我们无法保证包级变量的状态仍然和我们预期一致。我们需要有选择性的recover。原创 2024-04-28 09:31:05 · 156 阅读 · 0 评论 -
go圣经 ——方法
在第二组代码中我们将这两个变量联合起来变成了一个有mutex方法的 结构体变量,这是一个匿名的struct,同时我们又能使用mapping这个变量,使得结构更加统一。方法是与结构体相关联的函数,它允许我们从Rect类型的实例中选择并计算其面积。这里只是记录了自己学过一遍但是在圣经(狼吞虎咽)中又看到的新鲜玩意。比如都有max方法在Point和RGBA中,就会报错。我们的选择器可以不需要接收器就可以被调用。选择器中有多个同名的方法会报错。省略了上面的匿名函数。原创 2024-04-28 09:29:53 · 377 阅读 · 0 评论 -
【无标题】
我们再继续细说比较的问题: 如果两个接口值的动态类型相同,但是这个动态类型是不可比较的(比如切片),如果对他们进行比较就会panic。这个语法实际上是在编译器的时候,我们并不知道接口值的动态类型是什么,所以一个接口上的调用必须使用动态分配。其次,当我声明一个接口变量的时候,我实际上是在声明一个可以持有任何实现了该接口的具体类型的变量。一个接口的值由两个部分组成,一个是具体的类型,另一个是那个类型的值,我们称他们两者分别为。在接口值和nil进行比较的时候,需要动态类型和接口值都等于nil。原创 2024-04-28 09:28:19 · 260 阅读 · 0 评论