[日常] Go语言圣经--结构体,JSON习题
Go语言圣经-结构体
1.结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体
2.通常一行对应一个结构体成员,成员的名字在前类型在后,不过如果相邻的成员类型如果相同的话可以被合并到一行
3.如果结构体成员名字是以大写字母开头的,那么该成员就是导出的;这是Go语言导出规则决定的。一个结构体可能同时包含导出和未导出的成员。
4.一个命名为S的结构体类型将不能再包含S类型的成员:因为一个聚合的值不能包含它自身,S类型的结构体可以包含*S指针类型的成员
我们使用一个二叉树来实现一个插入排序:
5.结构体类型的零值是每个成员都是零值。通常会将零值作为最合理的默认值
6.结构体字面值,第一种要求以结构体成员定义的顺序为每个结构体成员指定一个字面值
第二种写法,以成员名字和相应的值来初始化,可以包含部分或全部的成员,更常用
7.企图隐式使用未导出成员的行为是不允许的
8.如果考虑效率的话,较大的结构体通常会用指针的方式传入和返回,函数中
9.如果要在函数内部修改结构体成员的话,用指针传入是必须的;因为在Go语言中,所有的函数参数都是值拷贝传入的,函数参数将不再是函数调用时的原始变量。
10.结构体比较,如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的
11.可比较的结构体类型和其他可比较的类型一样,可以用于map的key类型。
12.结构体嵌入和匿名成员,让我们只声明一个成员对应的数据类型而不指名成员的名字;这类成员就叫匿名成员,得意于匿名嵌入的特性,我们可以直接访问叶子属性而不需要给出完整的路径:
13.结构体字面值并没有简短表示匿名成员的语法
14.Printf函数中%v参数包含的#副词,它表示用和Go语言类似的语法打印值。对于结构体类型来说,将包含每个成员的名字。
Go语言圣经-JSON
1.标准库中的encoding/json、encoding/xml、encoding/asn1等包提供支持
2.一个JSON数组可以用于编码Go语言的数组和slice
3.JSON的对象类型可以用于编码Go语言的map类型(key类型是字符串)和结构体
4.将一个Go语言中类似movies的结构体slice转为JSON的过程叫编组(marshaling)。编组通过调用json.Marshal函数完成,返还一个编码后的字节slice,包含很长的字符串
5.json.MarshalIndent函数将产生整齐缩进的输出,两个额外的字符串参数用于表示每一行输出的前缀和每一个层级的缩进
6.只有导出的结构体成员才会被编码,这也就是我们为什么选择用大写字母开头的成员名称
7.结构体的成员Tag可以是任意的字符串面值,但是通常是一系列用空格分隔的key:"value"键值对序列;因为值中含义双引号字符,因此成员Tag一般用原生字符串面值的形式书写
8.编码的逆操作是解码,对应将JSON数据解码为Go语言的数据结构,Go语言中一般叫unmarshaling,通过json.Unmarshal函数完成
9.用url.QueryEscape来对查询中的特殊字符进行转义操作。
10.使用了基于流式的解码器json.Decoder,它可以从一个输入流解码JSON数据,还有一个针对输出流的json.Encoder编码对象
练习 4.10: 修改issues程序,根据问题的时间进行分类,比如不到一个月的、不到一年的、超过一年。
练习 4.11: 编写一个工具,允许用户在命令行创建、读取、更新和关闭GitHub上的issue,当必要的时候自动打开用户默认的编辑器用于输入文本信息。
练习 4.12: 流行的web漫画服务xkcd也提供了JSON接口。例如,一个 https://xkcd.com/571/info.0.json 请求将返回一个很多人喜爱的571编号的详细描述。下载每个链接(只下载一次)然后创建一个离线索引。编写一个xkcd工具,使用这些离线索引,打印和命令行输入的检索词相匹配的漫画的URL。
练习 4.13: 使用开放电影数据库的JSON服务接口,允许你检索和下载 https://omdbapi.com/ 上电影的名字和对应的海报图像。编写一个poster工具,通过命令行输入的电影名字,下载对应的海报。
// Issues prints a table of GitHub issues matching the search terms.
package main import (
"fmt"
"github"
"log"
"os"
"time"
)
/*
练习 4.10: 修改issues程序,根据问题的时间进行分类,比如不到一个月的、不到一年的、超过一年。
*/
func main() {
result, err := github.SearchIssues(os.Args[1:])
if err != nil {
log.Fatal(err)
}
fmt.Printf("%d issues:\n", result.TotalCount)
//当前时间
now := time.Now().Unix()
//前一个月
preMonth := now - 30*24*3600
//前一年
preYear := now - 365*24*3600
var notMonth []*github.Issue
var notYear []*github.Issue
var overYear []*github.Issue for _, item := range result.Items {
createTime := item.CreatedAt.Unix()
if createTime > preMonth {
notMonth = append(notMonth, item)
continue
}
if createTime < preMonth && createTime > preYear {
notYear = append(notYear, item)
continue
}
overYear = append(overYear, item)
} fmt.Println("issues(不到一个月):")
for _, item := range notMonth {
fmt.Printf("#%-5d %9.9s %.55s 时间:%s\n", item.Number, item.User.Login, item.Title, item.CreatedAt)
} fmt.Println("issues(不到一年):")
for _, item := range notYear {
fmt.Printf("#%-5d %9.9s %.55s 时间:%s\n", item.Number, item.User.Login, item.Title, item.CreatedAt)
}
fmt.Println("issues(超过一年):")
for _, item := range overYear {
fmt.Printf("#%-5d %9.9s %.55s 时间:%s\n", item.Number, item.User.Login, item.Title, item.CreatedAt)
}
}
[日常] Go语言圣经--结构体,JSON习题的更多相关文章
- [日常] Go语言圣经-WEB服务与习题
Go语言圣经-web服务 1.Web服务程序,标准库里的方法已经帮我们完成了大量工作 2.main函数将所有发送到/路径下的请求和handler函数关联起来,/开头的请求其实就是所有发送到当前站点上的 ...
- [日常] Go语言圣经--并发的循环习题
练习 8.4: 修改reverb2服务器,在每一个连接中使用sync.WaitGroup来计数活跃的echo goroutine.当计数减为零时,关闭TCP连接的写入,像练习8.3中一样.验证一下你的 ...
- C语言中结构体赋值问题的讨论
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- C语言的结构体和C++结构体的区别
关于C++中声明结构体中需要使用构造器创建实例对象的语法: <C++的结构体构造方法的基本概念:结构体的构造方法需要和结构体的名字相同,并且无返回值,也不要void关键字,这样的方法就是构造器的 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体,以及计算结构体成员的对其值以及总大小(类也是这样算) 结构体的特性 1.结构体(struct)是由一系列具有相同类型或不 ...
- C语言中结构体赋值问题的讨论(转载)
今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...
- go语言学习-结构体
结构体 go语言中的结构体,是一种复合类型,有一组属性构成,这些属性被称为字段.结构体也是值类型,可以使用new来创建. 定义: type name struct { field1 type1 fie ...
随机推荐
- 数独 php
数独求解程序 php版 转载请注明出处:http://xiezhenye.com/2008/06/%e6%95%b0%e7%8b%ac%e6%b1%82%e8%a7%a3%e7%a8%8b%e5% ...
- WPF 打印界面(控件)到A4纸
这次遇到一个需求,就是将整个界面打印在A4纸上. 需求清楚后,Bing一下关于打印,就找到一个类PrintDialog ,其中两个方法可能会用到: 特别是public void PrintVisual ...
- eclipse代码提示javadoc背景为黑色框的解决办法
我的eclipse是近期下载的oxygen版本.不知道怎么出现了一个这个问题,鼠标悬停指向代码时应该出现的代码提示解释框,全为黑色,看不到文字.如下图 经过验证,最终解决方法为window->G ...
- 18_python_类关系
一.类与类之间的关系 1.依赖关系 class Elephant: def __init__(self, name): self.name = name def open(self, ...
- HTML元素ID和JS方法名重复,JS调用失败
HTML元素ID和JS方法名重复时,JS中的重名方法无法被找到,不能执行. 修改ID或者方法名,两者不一致即可.
- iOS-【最新】跳转到 App Store 评分
APP应用内 App Store 跳转评分 NSString *itunesurl = @"itms-apps://itunes.apple.com/cn/app/id你的APPid?mt= ...
- Git文件状态
在Git中,文件状态是一个非常重要的概念,不同的状态对应不同的操作.因此,要想熟练掌握Git的用法,需要了解Git的几种文件状态. Git库所在的文件夹中的文件大致有4种状态: Untracked:未 ...
- (转)python中的selectors模块
原文:https://www.cnblogs.com/yinheyi/p/8127871.html https://www.rddoc.com/doc/Python/3.6.0/zh/library/ ...
- Android的ListView分页功能(上滑加载更多)
今天主要工作是将之前实现的各种ListView显示全部信息,优化成了每次加载几条数据,然后上滑的时候加载更多,底部显示一个进度条和一个文字提示,然后加载完毕后,将提示信息隐藏. 一边看教学视频一遍敲代 ...
- Fragment中启动一个新的Activity
最近遇到一个小问题,就是我在主界面中用的是Fragment,其中四个Fragment,然后打算在其中一个里边,写一个TextView(准确地说是Linearout)的单击事件,然后跳转到另外一个Act ...