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

84 阅读3分钟

之前那个文章其实还有一个题目

让我们来看一下,要求:练习 1.4: 修改dup2,出现重复的行时打印文件名称。

如果不使用go语言解决,使用C语言解决的话,首先将文件名保存,然后再将每一行的内容进行储存,可以考虑使用字符数组。再设置一个变量存放到底有多少行内容了。
每读入一个文件都保存下文件名字,然后每一行都逐一判断是否与相应的已经保存的内容出现了重复,使用循环解决,不过这样虽然能够完成目标,十分耗费时间和空间。
但是如果你希望通过字符串比较的方法那就只能这样,这里我们可以考虑按照行首元素排序方式降低复杂度,也可以通过建立哈希表的方式进行比较,还可以通过使用信息指纹的方式来进行比较,不过最后这个可能会出现错误率,不过并不高。 go语言提供了相比C语言更强大的工具,可以帮助我们更便捷地编写代码,所以代码如何书写就不多说了。


包的引用相信各位都有一定的基础,当导入的包在某个路径下,我们可以直接使用最后的包名来调用它。

其次就是常量的声明,使用const来声明,通过其声明的变量在编译之后运行是不会改变的值,通常设置为包级别的声明,使其在所有的函数内部可以被识别使用。

var palette = []color.Color{color.White, color.Black}
anim := gif.GIF{LoopCount: nframes}

上面两个表达式就是复合声明,分别生成的是slice切片和struct结构体。

gif.GIFstruct类型的。struct是一组值的集合,可以是不同类型的变量,通过这种方式让变量形成一种逻辑关系,绑定在一起。当要调用其中的各别字段时使用.来实现。

当我们使用上述写法生成结构体变量的时候,给定数值的字段会被赋值,其他字段保持各自类型的默认零值。我们会使用到append内置函数来向切片后添加数据,参数多种多样,满足各种情况。

s := []int{1, 2, 3}
s = append(s, 4) // s现在是 [1, 2, 3, 4]

s := []int{1, 2, 3}
s = append(s, 4, 5, 6) // s现在是 [1, 2, 3, 4, 5, 6]

s1 := []int{1, 2, 3}
s2 := []int{4, 5, 6}
s1 = append(s1, s2...) // s1现在是 [1, 2, 3, 4, 5, 6]

使用append函数时,原始切片可能内存不足发生扩容,所以需要使用一个变量接受其返回的结果。

将标准输出流重定向可以使用:./balabala > balabala.txt 之类的命令实现。具体的代码就不贴出来了,这次虽然写得很少但是真心比较憔悴,感觉代码越来越难读了,开始不会了。