经典算法整理(Go语言实现) 回溯算法(Backtracking Algorithm)也可以叫做回溯搜索法,它是一种经典的搜索算法,它基于深度优先搜索(DFS)的思想,通过递归地尝试每一种可能的情况来解决问题。
Kubernetes学习笔记 Kubernetes 集群由一个控制面和一组用于运行容器化应用的工作机器组成,这些工作机器称作节点(Node)。每个集群至少需要一个工作节点来运行 Pod。工作节点托管着组成应用负载的 Pod。控制面管理集群中的工作节点和 Pod。在生产环境中,控制面通常跨多台计算机运行,而一个集群通常运行多个节点,以提供容错和高可用。控制面组件:控制面组件会为集群做出全局决策,比如资源的调度。以及检测和响应集群事件,例如当不满足 Deployment 的 replicas 字段时,要启动新的 Pod)。
二叉树基础 如果节点 X 存储在数组中下标为 i 的位置,下标为 2 * i 的位置存储的就是左子节点,下标为 2 * i + 1 的位置存储的就是右子节点。从前面画的前、中、后序遍历的顺序图,可以看出来,每个节点最多会被访问两次,所以遍历操作的时间复杂度,跟节点的个数 n 成正比,也就是说二叉树遍历的时间复杂度是 O(n)。经典的方法有三种,前序遍历、中序遍历和后序遍历。编号3的二叉树中,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫做完全二叉树。
Go 编程模式:Functional Options学习笔记 这组代码传入一个参数,然后返回一个函数,返回的这个函数会设置自己的 Server 参数。上述编码不但解决了“使用 Config 对象方式的需要有一个 config 参数,但在不需要的时候,是放 nil 还是放 Config{}”的选择困难问题,也不需要引用一个 Builder 的控制对象,直接使用函数式编程,在代码阅读上也很优雅。再定一个 NewServer()的函数,其中,有一个可变参数 options ,它可以传出多个上面的函数,然后使用一个 for-loop 来设置 Server 对象。
Go语言var prev *ListNode和pre := &ListNode{}的区别 var prev *ListNode 只声明了一个指针变量 prev,并没有分配或初始化任何 ListNode 实例。pre := &ListNode{} 不仅声明了一个指针变量 pre,还分配并初始化了一个 ListNode 实例,并将 pre 指向这个新实例。
认识Go语言空结构体 需要注意的是,虽然空结构体不占用任何额外的空间来存储字段,但在某些情况下(例如作为映射的键或通道的元素),它们仍然会占用一些内存来标识唯一的实例。本质上来讲,使用空结构体的初衷只有一个:节省内存,但是更多的情况,节省的内存其实很有限,这种情况使用空结构体的考量其实是:根本不关心结构体变量的值。golang 正常的 struct 就是普通的一个内存块,必定是占用一小块内存的,并且结构体的大小是要经过边界,长度的对齐的。结构体名称是你为结构体定义的名称,字段是结构体的成员变量,类型是字段的数据类型。
Go 编程模式:错误处理学习笔记 nil 的情况,退出循环后有一个 scanner.Err() 的检查,看来使用了结构体的方式。这段代码通过使用 Closure 的方式把相同的代码给抽出来重新定义一个函数,这样大量的 if err!=nil 处理得很干净了,但是会带来一个问题,那就是有一个 err 变量和一个内部的函数,感觉不是很干净。Go 语言的函数支持多返回值,所以,可以在返回接口把业务语义(业务返回值)和控制语义(出错返回值)区分开。Go语言的错误处理的方式,本质上是返回值检查,但它兼顾了异常的一些好处——对错误的扩展。
Go编程模式:切片、接口、时间和性能学习笔记 这种编程模式在 Go 的标准库有很多的示例,最著名的就是 io.Read 和 ioutil.ReadAll 的玩法,其中 io.Read 是一个接口,你需要实现它的一个 Read(p []byte) (n int, err error) 接口方法,只要满足这个规则,就可以被 ioutil.ReadAll这个方法所使用。a[1:16] 的切片赋给 b ,此时,a 和 b 的内存空间是共享的,然后,对 a 做了一个 append()的操作,这个操作会让 a 重新分配内存,这就会导致 a 和 b 不再共享。
Go语言练习——罗马数字转整数 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。输入: s = “IV”
Go语言Select chan用法详解 select 语句是 Go 语言中用于处理多个通道操作的关键字,它允许你在多个通道上进行非阻塞的选择操作。select 语句可以用于以下几种情况:监听多个通道:你可以同时监听多个通道,一旦其中任何一个通道就绪(有数据可读或可写),select 就会选择第一个就绪的通道执行相关操作。超时操作:你可以使用 select 结合定时器通道来实现超时操作,以确保不会无限期地等待通道操作完成。避免阻塞:当某个通道操作可能导致程序阻塞时,select 可以帮助你避免阻塞,以保持程序的响应性。
为什么要实例化对象 在Go中,你可以使用结构体来表示对象,并通过实例化结构体来创建对象的具体实例。总之,对象实例化是面向对象编程中的基本概念,它允许你创建具体的对象,封装数据和行为,并在程序中使用这些对象来表示和操作实际问题。我们可以使用Go中的结构体来表示矩形对象,并通过实例化结构体来创建具体的矩形实例。在面向对象编程中,实例化对象是为了创建类的具体实例,以便在程序中使用这些实例来表示和操作某种数据或行为。模块化和重用:我们可以创建多个不同的矩形实例,每个实例都可以独立使用,从而实现了代码的模块化和重用。
Go语言实现C方法的调用 这涉及到使用 import “C” 来导入 C 代码,并将 Go 数据类型映射到 C 数据类型。在这个示例中,使用 -I 指定包含 C 头文件的目录,并使用 -L 指定 C 库的目录和 -l 指定库的名称。在 Windows 上,可能需要将 C 代码编译为 DLL,并在链接选项中使用 -ldflags -lmylibrary.dll,以加载动态链接库。在上述 Go 代码中使用 import “C” 导入了 C 代码,并在 main 函数中调用了 C.helloFromC()。
Go语言实现监听某方法调用返回值并与上一次的结果进行比较的方法 在这个示例中,创建了一个通道 resultChan 和一个变量 prevResult 来存储上一次的结果。在匿名函数的协程中,循环调用 SomeFunction 并将当前结果和上一次结果发送到通道中。要实现监听某个方法调用的返回值,并与上一次的结果进行比较,可以在监听方法调用的返回值时,将上一次的结果也传递到通道中。然后,在接收通道中的返回值时,你可以比较新旧值并执行相应的逻辑。在主协程中,循环接收通道中的结果,并比较当前结果和上一次结果。根据比较结果,执行相应的逻辑。