201903-30 slice删除元素的性能对比 NEW package main import ( "testing" ) // 第一种 func BenchmarkMake(t *testing.B) { t.ResetTimer() origin := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for i := 0; i < t.N; i++ { target := make([]int, len(origin)) for _, ite... Read More >
201903-30 goquery 爬虫实践 NEW /*获取URL范例*/ /* Find 查找获取当前匹配的每个元素的后代 Eq 选择第几个 Attr 获取对应的标签属性 AttrOr 获取对应的标签属性。这个可以设置第二个参数。获取的默认值 如果获取不到默认调用对应默认值 Each 遍历每一个元素 Text 获取当前对应的文本 Html 获取当前对象的标签 AddClass 添加 class 不过用来抓取有点鸡肋不知道为何要写这个 Children 返回所有子元素 Filter 过滤标签元素 Prev 获取上一个元素 Ne... Read More >
201903-30 beego orm 一对多、多对多 关联查询 NEW 一对多 model ype User struct {Id int64 json:"id"Name string json:"name,omitempty" orm:"size(50)"Passwords string json:"passwords" orm:"size(32)"Baby []Baby json:"baby" orm:"reverse(many)"}type Baby struct {Id int64Name str... Read More >
201903-30 每周一道算法题006:抽签组合 问题: 有如下3支队伍,每个队伍都有2名队员。team1:A,B;team2:C,D;team3:E,F; 现在每个队出1个人,组成一个队去探险,请列出所有的组队方式。 思路: 这就是一个组合的问题,每个队里挑一人,那么总共应该有2x2x2=8种组合方式。如果暴力求解,那就是三层循环嵌套。但如果问题扩展一下,变成10个队,每个队10人,就无法暴力求解了,至少代码是没有扩展性的。 有如下一种思路: 循环所有的队伍第一次取出A,B两名队员,存起来;第二次取出C,D两名队员,与前一... Read More >
201903-30 go map 统计字符串出现次数 package main import ( "fmt" "strings" ) func main() { str := "I love dba work I love my go work too I I I I" m1 := make(map[string]int) for _, v := range strings.Fields(str) { if _, ok := m1[v]; ok {... Read More >
201903-30 go channel 理解 1、未使用go channelpackage main import ( "fmt" "time" ) func printer(s string) { for _, v := range s { fmt.Println(string(v)) time.Sleep(time.Millisecond * 3000) } } func person() { printer("hello") } fun... Read More >
201903-30 golang中用链表实现栈 node通过prev字段进行关联,stack维护栈顶节点 stack.go package stack type Stack struct { top *node length int } type node struct { value interface{} prev *node } // 创建一个栈 func New() *Stack { return &Stack{nil, 0} } // 取栈长度 fu... Read More >
201903-30 每周一道算法题003:翻牌 问题: 有100张写着数字1~100的牌,并按顺序排列。最开始所有牌都是背面朝上放置。某人从第2张牌开始,隔1张牌翻牌。然后第2, 4, 6, …,100张牌就会变成正面朝上。接下来,另一个人从第3张牌开始,隔2张牌翻牌(原本背面朝上的,翻转成正面朝上;原本正面朝上的,翻转成背面朝上)。再接下来,又有一个人从第4张牌开始,隔3张牌翻牌。像这样,从第n张牌开始,每隔n-1张牌翻牌,直到没有可翻动的牌为止。求当所有牌不再变动时,所有背面朝上的牌的数字。 思路: 这道题思路有很多种... Read More >
201903-30 将目录中所有.go文件进行go fmt 代码以及使用方法:https://github.com/lzw730/gofmtAllDir package main import ( "flag" "fmt" "io/ioutil" "log" "os" "os/exec" "path/filepath" "strings" ) //获取指定目录及所有子目录下的所有文件,可以匹配后缀过滤。 func WalkDir(dirPth string) (d... Read More >
201903-30 (一)Golang的概述 Google创造Golang的原因: 计算机硬件技术更新频繁,性能提高很快。目前主流的编程语言发展明显落后于硬件,不能合理利用多核多CPU的优势提升软件系统性能。 软件系统复杂度越来越高,维护成本越来越高,目前缺乏一个足够简洁高效的编程语言。【现有的编程语言;风格不统一;计算能力不够;处理大并发不够好】 企业运行维护很多c/c++的项目,c/c++程序运行速度虽然很快,但是编译速度却很慢,同时还存在“内存泄漏”的一系列的困扰需要解决。 Golang的发展历程: 2007年,谷... Read More >
201903-30 Prometheus kafka 消息队列适配器 最近工作上有个需求,需要把prometheus 采集到的数据上报到kafka消息队列,看了下官方实现,prometheus 支持remote_write / remote_read 的方式扩展,可以在此基础上做文章。 github 上面有个现成的插件,看了一下,主要存在以下一些问题: 1、从环境变量读取配置(不够灵活,后续不好优化,不能做到配置热加载) 2、把client 对象创建的逻辑... Read More >
201903-30 golang file 操作笔记 1、文件拷贝: package main import ( "fmt" "io" "os" "strings" ) func main() { list := os.Args if len(list) != 3 { fmt.Println("输入给谁错误,格式为:xxx.go 源文件名 目标文件名") return } fmt.Println("源文件路径:", list[1... Read More >
201903-30 每周一道算法题002:四则运算 问题: 求位于1000~9999,满足如下条件的数: 各位数字间加入四则运算符,也可省略,使得按四则运算计算的结果为原数字的各位数逆序排列。 例如:351 → 3×51 = 153 思路: 遍历1000-9999所有的数字,切分并组合运算符,拼成四则运算的算式然后计算。4位数中最大的数是9999,他可以被拆成999+9=1008,逆排后不可能等于原数,减法和除法不可能计算出比原数更大的数,所以只需要考虑乘法。 php提供了eval函数,可以很方便的计算,但是需要对数字进行处理... Read More >
201903-30 使用Go语言优雅地统计单词个数 type WordCounter int func (c *WordCounter) Write(p []byte) (int, error) { scanner := bufio.NewScanner(bytes.NewReader(p)) // set the split function for the scanning operation scanner.Split(bufio.ScanWords) // Count the word... Read More >
201903-30 (二)Golang的变量 为什么需要变量: 变量是程序的基本组成单位不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如:下面代码中sum、sub都是变量。 func getVal(num1 int, num2 int) (int, int) { sum := num1 + mum2 sub := num1 - num2 return sum, sub } func main() { sum, sub := getVal(30, 30) fmt.Println("sum=", sum... Read More >
201903-30 每周一道算法题005:切木棒 问题: 假设要把长度为n厘米的木棒切分为1厘米长的小段,但是1根木棒只能由1人切分,当木棒被切分为3段后,可以同时由3个人分别切分木棒。求最多有m个人时,最少要切分几次。 譬如n=8,m=3时如下图所示,切分4次就可以了。 求当n=20,m=3时的最少切分次数。求当n=100,m=5时的最少切分次数。 思路: 这道题最难的不是算法,而是理解题意。木棒刚开始只有1根,题目规定“1根木棒只能由1人切分”,此时由1人切分后,变成2根;2根木棒再做切分,也要满足“1根木棒只能由1人切... Read More >
201903-30 golang 聊天室学习笔记 1聊天室服务器端package main import ( "fmt" "net" "strings" "time" ) //定义的此结构体为全局map的value值,包括每一个用户的姓名,ip地址和私人管道 type client struct { name string addr string C chan string } /*这个函数是将私人管道中的内容发送给用户,配合全局管道Message使用可以实... Read More >
201903-30 每周一道算法题004:背包 问题: 假设你要去野营。你有一个容量为6磅的背包,需要决定该携带下面的哪些东西。其中每样东西都有相应的价值,价值越大意味着越重要: •水(重3磅,价值10); •书(重1磅,价值3); •食物(重2磅,价值9); •夹克(重2磅,价值5); •相机(重1磅,价值6)。请问携带哪些东西时价值最高? 思路: 这是一个典型的背包问题,求解此类问题,通常会使用动态规划法。不要被名字吓到,其实并不难。下面我们来讲解该算法。 动态规划算法都是从网格开始的,我们先画一个... Read More >
201903-30 每周一道算法题007:兑换零钱 问题: 已知可兑换的零钱种类有1元,5元,10元,20元4种,现在有100块钱要换成零钱且总数量少于15张,有几种换法?分别是什么? 思路: 已知有[1,5,10,20]这样的一个可选数据集S,现在要从中取出n个数,每个数的张数为a,使得a1xn1+a2xn2+...aixni = 100。 最大的面额是20,总共需要100/20=5张,这是最少的张数,所以循环的下限是5,上限题目已经限定了,是15。 也就是说,从S这个数据集中,取5-15个数,使得他们的和为100,数是可... Read More >
201903-30 go tcp c/s server client 学习笔记 server1:package main import ( "fmt" "net" ) func main() { l, err := net.Listen("tcp", "127.0.0.1:9876") if err != nil { fmt.Println(err) } fmt.Println("服务器等待客户端连接") conn, err := l.Accept() if err !=... Read More >