Go语言学习
文章平均质量分 71
学习Go语言过程,参考Go语言圣经
wyx学习k8s
一起学习
展开
-
go语言接口之http.Handler接口
从上面的代码很容易看出应该怎么构建一个程序,它有两个不同的web服务器监听不同的端口 的,并且定义不同的URL将它们指派到不同的handler。此外,在一个应用程序的多个文件中定义HTTP handler也是非常典型的,如果它们必须 全部都显示的注册到这个应用的ServeMux实例上会比较麻烦。最后,一个重要的提示:web服务器在一个新的协程中调用每一 个handler,所以当handler获取其它协程或者这个handler本身的其它请求也可以访问的变量 时一定要使用预防措施比如锁机制。原创 2024-06-11 08:35:21 · 824 阅读 · 0 评论 -
go语言之控制结构2
如果想要重复执行某些语句,Go 语言中您只有 for 结构可以使用。原创 2024-05-15 14:51:21 · 297 阅读 · 0 评论 -
go语言之map
哈希表是一种巧妙并且实用的数据结构。它是一个无序的key/value对的集合,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或者删除对用的value。在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应的key和value。map中所有的key都是相同的类型,所有的value也是相同的类型,但是key和value之间可以是不同的数据类型。原创 2024-05-22 10:49:26 · 1005 阅读 · 0 评论 -
go语言基础1
token是构成源程序的基本不可在分割单元。编译器编译源程序的第一步就是将源程序分割为一个个独立的token,这个过程就是词法分析。Go语言的token可以分为关键字、标识符、操作符、分隔符和字面常量等,如图所示:Go token分隔符有两类:一类是操作符,还有一类自身没有特殊含义,仅用来分隔其他token,被称为纯分隔符。操作符:操作符就是 个天然的分隔符,同时其自身也是一个 token, 语句如下所示 sum:=a+b。原创 2024-05-13 15:41:38 · 1179 阅读 · 0 评论 -
go语言数组与切片
数组 类型名是[n]elemetType,其中n是数组长度,elementType是数组元素类型。比如一个包 含2个int类型元素的数组类型可表示为[2]int。数组一般在创建时通过字面量初始化,单独声明一个数组类型变量而不进行初始化是没有意义的。数组的特点:数组创建后长度就固定了,不可以在追加元素数组是值类型,数组赋值或作为函数参数都是值拷贝数组长度是数组类型的组成部分,[10]int和[20]int表示不同的类型可以根据数组创建切片。原创 2024-05-16 10:31:16 · 286 阅读 · 0 评论 -
go语言函数之defer
defer也有明显的副作用:defer会推迟资源的释放,defer 尽量不要放到循环语句里面,将大部分函数内部的defer语句单独拆分成一个小函数是一种很好的实践方式。defer函数的实参在注册时通过值拷贝传递进去,下面示例的代码中,实参a额值在defer注册时通过值拷贝方式传递进去,后续语句a++并不会影响defer语句最后的输出结果。defer的好处是可以在一定程度上避免资源泄露,特别是有很多return语句,有多个资源需要关闭的场景中,很容易漏掉资源的关闭操作。原创 2024-05-21 13:27:10 · 502 阅读 · 0 评论 -
go语言中Print,Printf和Println的区别
Print是Golang的fmt包中的内置函数,使用其操作数的默认格式打印格式并写入标准输出;Println是Golang的fmt包中的内置函数,用于在结尾处打印带有新行的消息到控制台。它需要零个或多个任意类型的参数,并使用空格分隔它们;Printf是Golang的fmt包中的另一个内置函数,它用于打印指定格式的消息到控制台。它需要一个字符串作为第一个参数,字符串可以包含一个或多个格式动词,并且需要一个或多个值作为后续参数。原创 2024-05-16 10:49:44 · 569 阅读 · 0 评论 -
go语言之函数基础
函数是基本的代码块,Go是编译型语言,所以函数编写的顺序是无关紧要的,但是我们一般把main()函数写在文件的前面,其他函数按照一定的逻辑顺序编写(例如函数被调用顺序)。编写多个函数的主要目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务(那就是函数)来解决。而且,同一个任务(函数)可以被调用多次,有助于代码重用。注:Don’t Repeat Yourself,执行特定任务的代码只能在程序里面出现一次Go里面有三种类型的函数:1.普通的带有名字的函数2.匿名函数或者lambda函数。原创 2024-05-17 10:50:23 · 389 阅读 · 0 评论 -
go语言基础2
Go语言是一种强类型的静态编译语言,类型是高级语言的基础,有了类型,高级语言才能对不同类型抽象出不同的运算。Go语言内置七类基本数据类型(20个具体子类型)。布尔类型:bool整型:byte int int8 intl6 init32 int64 uint nt8 uintl6 uint32 uint64 uintptr浮点型:float32 float64复数:complex64 complexl28字符:rune字符串:string错误类型:error。原创 2024-05-14 13:23:58 · 271 阅读 · 0 评论 -
go语言之控制结构1
4 参考这个网站学习的。原创 2024-05-14 15:03:42 · 770 阅读 · 0 评论 -
go语言之函数签名与匿名函数
函数类型又叫函数签名,一个函数的类型就是函数定义首行去掉函数名、参数和{,可以使用fmt.Printf的"%T"格式化参数打印函数的类型。可以使用type定义函数类型,函数类型变量就可以作为函数的参数或返回值。函数类型和map、slice、chan一样,实际函数类型变量和函数名都可以当作指针变量,该指针指向函数代码的开始位置。通常来说,函数类型变量是一种引用类型,未初始化的函数类型的变量的默认值是nil。原创 2024-05-20 13:55:21 · 176 阅读 · 0 评论 -
go语言接口之接口定义
因为fmt.Fprintf函数没有对具体操作的值做任何假设而是仅仅通过io.Writer接口的约定来保证 行为,所以第一个参数可以安全地传入一个任何具体类型的值只需要满足io.Writer接口。一个具体的类型可以准确的描述它所代表的值 并且展示出对类型本身的一些操作方式就像数字类型的算术操作,切片类型的索引、附加和 取范围操作。具体的类型还可以通过它的方法提供额外的行为操作。让我们通过一个新的类型来进行校验,下面*ByteCounter类型里的Write方法,仅仅在丢失写 向它的字节前统计它们的长度。原创 2024-06-03 13:29:52 · 882 阅读 · 0 评论 -
go语言接口之sort.Interface接口
这个接口的实现由序列的具体表示和它希望排序的元素决定,序列的表示经常是一个切 片。我们会运行上面的例子来对一个表格中的音乐播放列表进行排序。)对于更复杂的排序,我们使用相同的方法,但是会用更复杂的数据结构和更复杂 地实现sort.Interface的方法。为了对序列进行排序,我们需要定义一个实现了这三个方法的类型,然后对这个类型的一个 实例应用sort.Sort函数。尽管一个最短的快排程序只要15 行就可以搞定,但是一个健壮的实现需要更多的代码,并且我们不希望每次我们需要的时候 都重写或者拷贝这些代码。原创 2024-06-06 09:23:02 · 830 阅读 · 0 评论 -
go语言方法之方法值和方法表达式
我们经常选择一个方法,并且在同一个表达式里执行,比如常见的p.Distance()形式,实际上 将其分成两步来执行也是可能的。p.Distance叫作“选择器”,选择器会返回一个方法"值"->一 个将方法(Point.Distance)绑定到特定接收器变量的函数。当调用一个方法时,与调用一个普通的函数相比,我们必 须要用选择器(p.Distance)语法来指定方法的接收器。在一个包的API需要一个函数值、且调用方希望操作的是某一个绑定了对象的方法的话,方 法"值"会非常实用(=_=真是绕)。原创 2024-05-30 15:09:27 · 483 阅读 · 0 评论 -
go语言方法之通过嵌入结构体来扩展类型
但这 是错误的理解。当编译器解析一个选择器到方法时,比如p.ScaleBy,它会首先去找直接定义在这个类 型里的ScaleBy方法,然后找被ColoredPoint的内嵌字段们引入的方法,然后去找Point和 RGBA的内嵌字段引入的方法,然后一直递归向下找。下面这个ColoredPoint的声明内嵌了一 个*Point的指针。当Point.Distance被第一个包装方法调用时,它的接收器值是p.Point,而不是p,当然了,在 Point类的方法里,你是访问不到ColoredPoint的任何字段的。原创 2024-05-29 13:20:53 · 856 阅读 · 0 评论 -
go语言接口之flag.Value接口
调用Var方法将标记加入应用的命令行标记集合中,有异常复杂命令行接口的全局变量 flag.CommandLine.Programs可能有几个这个类型的变量。调用Var方法将一个celsiusFlag参 数赋值给一个flag.Value参数,导致编译器去检查celsiusFlag是否有必须的方法。flag.Duration 函数创建一个time.Duration类型的标记变量并且允许用户通过多种用户友好的方式来设置这 个变量的大小,这种方式还包括和String方法相同的符号排版形式。原创 2024-06-05 08:28:40 · 529 阅读 · 0 评论 -
go语言方法之方法声明
Go语言圣经 方法声明 211 对于一个给定的类型,其内部的方法都必须有唯一的方法名,但是不同的类型却可以有同样 的方法名,比如我们这里Point和Path就都有Distance这个名字的方法;从我们的理解来讲,一个对象其实也就是一个简单的赋值或者一个变量,在这个对象中会包含一些方法,而一个方法则是一个一个和特殊类型关联的函数。第一个distance的调用实际上用的是包级别的函数main.Distance,而第二个则是使用刚刚声明的Point,调用的是Point类下声明的Point.Distance方法。原创 2024-05-28 10:28:01 · 1219 阅读 · 0 评论 -
go语言方法之封装
这两种类型决定性的不同:geometry.Path的本质是一个坐标点的序列,不多也不少,我们可 以预见到之后也并不会给他增加额外的字段,所以在geometry包中将Path暴露为一个slice。当然,一旦进行了导出,就没有办法在保证API兼容的 情况下去除对其的导出,所以在一开始的选择一定要经过深思熟虑并且要考虑到包内部的一 些不变量的保证,未来可能的变化,以及调用方的代码质量是否会因为包的一点修改而变 差。Go语言只有一种控制可见性的手段:大写首字母的标识符会从定义它们的包中被导出,小写的字母则不会。原创 2024-06-03 13:25:32 · 869 阅读 · 0 评论 -
go语言之实现接口的条件
不像基于类的语言,他 们一个类实现的接口集合需要进行显式的定义,在Go语言中我们可以在需要的时候定义一个 新的抽象或者特定特点的组,而不需要修改具体类型的定义。更多方法的接口类型会告诉我们更多关于它的值持有的信息,并且对实现它的类 型要求更加严格。因为任意bytes.Buffer的值,甚至包括nil通过(bytes.Buffer)(nil)进行显示的转换都实现了这个 接口,所以我们不必分配一个新的变量。因为接口实现只依赖于判断的两个类型的方法,所以没有必要定义一个具体类型和它实现的 接口之间的关系。原创 2024-06-04 08:51:41 · 703 阅读 · 0 评论 -
go语言接口之接口类型
io.Writer类型是用的最广泛的接口之一,因为它提供了所有的类型写入bytes的抽象,包括文 件类型,内存缓冲区,网络链接,HTTP客户端,压缩工具,哈希等等。Reader可以代表任意可以读取bytes的类型,Closer可以是任意可以关闭 的值,例如一个文件或是网络链接。上面用到的语法和结构内嵌相似,我们可以用这种方式以一个简写命名另一个接口,而不用声明它所有的方法。上面3种定义方式都是一样的效果。接口类型具体描述了一系列方法的集合,一个实现了这些方法的具体类型是这个接口类型的 实例。原创 2024-06-04 08:44:46 · 260 阅读 · 0 评论 -
go语言接口之接口值
其它类型要么是安全的可比较类型(如基本类型 和指针)要么是完全不可比较的类型(如切片,映射类型,和函数),但是在比较接口值或 者包含了接口值的聚合类型时,我们必须要意识到潜在的panic。这个接口值的动态类型被设为*os.Stdout指针的类型描述符,它的动态值持有os.Stdout的拷贝;概念上讲一个接口的值,接口值,由两个部分组成,一个具体的类型和那个类型的值。它们 被称为接口的动态类型和动态值。两个接口值相等仅当它们都是nil值或者它们的动态 类型相同并且动态值也根据这个动态类型的==操作相等。原创 2024-06-06 08:44:18 · 1012 阅读 · 0 评论 -
go语言方法之基于指针对象的方法
当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者 函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需 要用到指针了。在现实的程序里,一般会约定如果Point这个类有一个指针作为接收器的方法,那么所有Point 的方法都必须有一个指针接收器,即使是那些并不需要这个指针接收器的函数。这里的括号是必须的;1. 不管你的method的receiver是指针类型还是非指针类型,都是可以通过指针/非指针类型 进行调用的,编译器会帮你做类型转换。原创 2024-05-28 10:34:54 · 585 阅读 · 0 评论