《go语言圣经》习题答案-第5章
目录
5.11
5.13
5.14
5.15
5.16
5.17
5.19
习题答案,个人理解,欢迎交流指正
5.11
package mainimport ("fmt""sort"
)var dict = map[string][]string{"algorithms": {"data structures"},"calculus": {"linear algebra"},"linear algebra": {"calculus"},"compilers": {"data structures","formal languages","computer organization",},"data structures": {"discrete math"},"databases": {"data structures"},"discrete math": {"intro to programming"},"formal languages": {"discrete math"},"networks": {"operating systems"},"operating systems": {"data structures", "computer organization"},"programming languages": {"data structures", "computer organization"},
}func main() {list, ok := toposort(dict)if !ok {fmt.Println("存在环")return}for i, s := range list {fmt.Printf("%d\t%s\n", i+1, s)}
}func toposort(dict map[string][]string) ([]string, bool) {var list []stringseen := make(map[string]bool)wait := make(map[string]bool)var visitAll func(items []string) boolvisitAll = func(items []string) bool {for _, item := range items {if !seen[item] {seen[item] = truewait[item] = trueif !visitAll(dict[item]) {return false}list = append(list, item)wait[item] = false} else if wait[item] {return false}}return true}var keys []stringfor key := range dict {keys = append(keys, key)}sort.Strings(keys)if !visitAll(keys) {return nil, false}return list, true
}
5.13
package mainimport ("fmt""io/ioutil""net/http""strings"neturl "net/url""os""golang.org/x/net/html""gopl.io/util"
)func Extract(url string, hosts map[string]bool) ([]string, error) {resp, err := http.Get(url)if err != nil {return nil, err}if resp.StatusCode != http.StatusOK {resp.Body.Close()return nil, fmt.Errorf("getting %s: %s", url, resp.Status)}content, _ := ioutil.ReadAll(resp.Body)contentstr := string(content)doc, err := html.Parse(strings.NewReader(contentstr))resp.Body.Close()if err != nil {return nil, fmt.Errorf("parsing %s as HTML: %v", url, err)}var links []stringvisitNode := func(n *html.Node) {u, err := neturl.Parse(url)if err != nil {fmt.Printf("解析路径%s失败 %s\n", url, err)}dir := u.Hostif n.Type == html.ElementNode && n.Data == "title" && hosts[dir] {name := n.FirstChild.DatamkErr := os.Mkdir(dir, os.ModePerm)if mkErr != nil && os.IsNotExist(mkErr) {fmt.Printf("创建文件夹[%s]失败 %s\n", dir, mkErr)}fn := dir + "/" + name + ".html"file, err := os.OpenFile(fn, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)if err != nil {fmt.Printf("创建文件[%s]失败 %s\n", fn, err)} else {fmt.Printf("保存文件 %s\n", fn)file.WriteString(contentstr)file.Close()}}if n.Type == html.ElementNode && n.Data == "a" {for _, a := range n.Attr {if a.Key != "href" {continue}link, err := resp.Request.URL.Parse(a.Val)if err != nil {continue}links = append(links, link.String())}}}util.ForEachNode(doc, visitNode, nil)return links, nil
}
package mainimport ("fmt""log""net/url""os""strings"
)func main() {urls := os.Args[1:]seen := map[string]bool{}toVisit := []string{}toVisit = append(toVisit, urls...)hosts := map[string]bool{}for _, u := range urls {uu, err := url.Parse(u)if err == nil {hosts[uu.Host] = true}}for len(toVisit) != 0 {links := toVisittoVisit = nilfor _, link := range links {if strings.HasSuffix(link, "/") {link = link[:len(link)-1]}if !seen[link] {fmt.Println(link)seen[link] = truel, err := Extract(link, hosts)if err != nil {log.Print(err)}toVisit = append(toVisit, l...)}}}
}
5.14
package mainimport ("fmt""io/ioutil""os"
)func Bfs(f func(item string) []string, worklist []string) {seen := make(map[string]bool)for len(worklist) > 0 {items := worklistworklist = nilfor _, item := range items {if !seen[item] {seen[item] = trueworklist = append(worklist, f(item)...)}}}
}func crawlCourse() {var dict = map[string][]string{"algorithms": {"data structures"},"calculus": {"linear algebra"},"linear algebra": {"calculus"},"compilers": {"data structures","formal languages","computer organization",},"data structures": {"discrete math"},"databases": {"data structures"},"discrete math": {"intro to programming"},"formal languages": {"discrete math"},"networks": {"operating systems"},"operating systems": {"data structures", "computer organization"},"programming languages": {"data structures", "computer organization"},}f := func(s string) []string {fmt.Println(s)return dict[s]}items := []string{}for k, _ := range dict {items = append(items, k)}Bfs(f, items)
}func crawlFile() {root := []string{"gopl.io"}f := func(path string) []string {s, _ := os.Stat(path)if !s.IsDir() {fmt.Println(path)return nil}rd, err := ioutil.ReadDir(path)if err != nil {fmt.Printf("read dir[%s] faild %s\n", path, err)return nil}files := []string{}for _, fi := range rd {files = append(files, path+"/"+fi.Name())}return files}Bfs(f, root)
}func main() {crawlCourse()crawlFile()
}
5.15
package mainimport ("fmt""math"
)func main() {fmt.Println(max())fmt.Println(max(4))fmt.Println(max(8, 4, 9))
}func max(vals ...int) int {if len(vals) == 0 {return math.MaxInt}m := math.MinIntfor _, n := range vals {if n > m {m = n}}return m
}
package mainimport ("fmt"
)func main() {fmt.Println(max(4))fmt.Println(max(8, 4, 9))
}func max(val int, vals ...int) int {for _, n := range vals {if n > val {val = n}}return val
}
5.16
package mainimport ("bytes""fmt"
)func main() {fmt.Println(join(",", []string{"wewei"}...))fmt.Println(join(",", []string{}...))fmt.Println(join("", []string{"weiwei", "zheng"}...))
}func join(sep string, strs ...string) string {var buf bytes.Buffers := ""for _, str := range strs {buf.WriteString(s)buf.WriteString(str)s = sep}return buf.String()
}
5.17
package mainimport ("fmt""net/http""os""golang.org/x/net/html"
)func main() {resp, err := http.Get("https://www.hao123.com")if err != nil {fmt.Fprintf(os.Stderr, "echo: %v\n", err)os.Exit(1)}defer resp.Body.Close()doc, err := html.Parse(resp.Body)if err != nil {fmt.Fprintf(os.Stderr, "echo: %v\n", err)os.Exit(1)}nodes1 := ElementsByTagName(doc, "div")nodes2 := ElementsByTagName(doc, "a")nodes3 := ElementsByTagName(doc, "div", "a")fmt.Printf("%d, %d, %d\n", len(nodes1), len(nodes2), len(nodes3))
}func ElementsByTagName(doc *html.Node, names ...string) []*html.Node {tags := make(map[string]bool)for _, n := range names {tags[n] = true}var list []*html.Nodevar forEachNode func(doc *html.Node)forEachNode = func(doc *html.Node) {if doc.Type == html.ElementNode && tags[doc.Data] {list = append(list, doc)}for c := doc.FirstChild; c != nil; c = c.NextSibling {forEachNode(c)}}forEachNode(doc)return list}
5.19
package mainimport ("fmt"
)func main() {fmt.Println(f())
}func f() (code int) {defer func() {if p := recover(); p != nil {code = 1}}()panic("")
}
《go语言圣经》习题答案-第5章相关推荐
- 《金融数据分析导论:基于R语言》习题答案(第一章)
<金融数据分析导论:基于R语言>是芝加哥大学的教授Ruey S.Tsay所著,李洪成.尚秀芬.郝瑞丽翻译,机械工业出版社出版,是一本学习R语言和金融数据分析的很好的参考书籍. ** 注 ...
- c语言程序设计第四版乌云高娃,C语言程序设计教学课件作者第2版乌云高娃课件源程序及习题答案第4章课件.ppt...
C语言程序设计教学课件作者第2版乌云高娃课件源程序及习题答案第4章课件.ppt 第4章循环结构的流程及应用 学习目标 ? 使用循环处理需要反复执行的操作. ? 循环结构的流程图. ? 循环与条件的综合 ...
- 河南理工大学c语言程序第六章答案,河南理工大学C语言课后习题答案精解第六章..ppt...
河南理工大学C语言课后习题答案精解第六章. 选择题 (1) C语言中一维数组的定义方式为:类型说明符 数组名 A. [整型常量]B. [整型表达式] C. [整型常量]或[整型常量表达式]D. [变量 ...
- c语言实验答案周信东第三章,桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf...
桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf 成 绩 良 评 语 继 续 努 力 . 批 改 时 间 2013-11-16 105155 批 改 老 师 实 验 2 顺 ...
- 数据结构c语言版第二版第三章课后答案,数据结构(C语言版)习题集答案第三章.doc...
数据结构(C语言版)习题集答案第三章.doc 习题三3.1 3.10 3.13 3.5 3.6 3.15 3.17 3.19 3.24 3.29 3.31 3.51 给定操作序列P1P2P3PiPn( ...
- android应用程序设计张思民课后答案,Java语言程序设计习题答案(清华大学出版杜)张思民版...
Java语言程序设计习题答案(清华大学出版杜)张思民版 更新时间:2017/2/6 12:39:00 浏览量:568 手机版 第1章 Java概述 [1]为什么说Java的运行与计算机硬件平台无关 ...
- 《Go语言圣经》学习笔记 第九章 基于共享变量的并发
<Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...
- 8086微型计算机原理答案,8086微型计算机原理与应用(吴宁)习题答案(第三章)
8086微型计算机原理与应用(吴宁)习题答案(第三章) 8086微型计算机原理与应用(吴宁)习题答案(第二章) 第三章 3-3 (1) 源操作数 为立即寻址方式:目的操作数为寄存器寻址方式 (2) 源 ...
- C语言 用传统流程图表示分段函数,C语言程序设计习题答案
C语言程序设计习题答案 习题一 C语言程序设计概述 一.名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 ...
- c语言程序设计第三版杜有福,C语言程序设计习题答案 杜有福
C语言程序设计习题答案 杜有福 C语言程序设计习题答案 习题一 C语言程序设计概述 一.名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6) ...
最新文章
- 5 步助你成为一名优秀的 Docker 代码贡献者
- 一天发多少短信会封号_枸杞一天吃多少?吃多了会怎样?黑枸杞红枸杞哪个好?...
- 前端学习(1384):多人管理项目4资源的路径
- 【OS学习笔记】二十 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之主引导扇区程序
- sonarqube使用mysql_SonarQube的安装、配置与使用
- 【机器学习】ICA 原理以及相关概率论,信息论知识简介
- 实验五 数独游戏界面设置
- 福特牵手百度启动L4级自动驾驶联合测试,年底“上路”
- 【转载】规则化和模型选择(Regularization and model selection)
- Android之Retrofit详解(转载)
- 最新win7/win10/XP系统下载_「装机系统」_百度云
- mysql java 社工库_社工库源码 汇总 持续更新
- 2019年8月 华为鸿蒙,华为2019年开发者大会将于8月9日举行,期待鸿蒙吗?
- WebGL压缩纹理实践
- 做外链的六个有效技巧
- 联想电脑安装虚拟机出现不可恢复的错误
- 【信息安全案例】——网络信息面临的安全威胁(学习笔记)
- 用python绘制熊猫图案_在python中绘制熊猫系列的CDF
- android anr 文件路径,android出现ANR 如何导出anr文件
- SpringBoot系列之Spring Data MongoDB教程
热门文章
- 2010年券商十大金股(名单)
- 暗云Ⅲ: 迄今为止最复杂的木马之一
- Windows 11安装realtek audio control
- JS设计模式初探——单例模式
- 记一次前端启动报错npm ERR! 12@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.c
- G - dfs POJ - 2386
- Android APP Camera2应用(02)预览流程
- 华为视频会议,助力企业往高品质发展
- springboot毕设项目高校课程知识库系统hd2m4(java+VUE+Mybatis+Maven+Mysql)
- 【转】铝电解电容品牌排行榜