{"action":"created","comment":{"url":"https://api.github.com/repos/studygolang/GCTT/pulls/comments/167747102","pull_request_review_id":95812493,"id":167747102,"diff_hunk":"@@ -0,0 +1,161 @@\n+## 非安全指针以及系统调用\n+\b\b按照go语言官方文档所说, __unsafe__ 是关注Go程序操作类型安全的包。  \n+\n+\b像包名暗示的一样，使用它要格外小心； __unsafe__ 可以特别危险，但它也可以特别有效。例如，当处理系统调用时，Go的结构体必须和C的结构体拥有相同的内存结构，这时你可能除了使用 __unsafe__ 以外，别无\b选择。\n+\n+\b __unsafe.Pointer__ 可以让你无视Go的类型系统，完成\b任何类型与内建的 uintptr 类型\b之间的转化。根据文档, __unsafe.Pointer__ 可以\b实现四种其他类型不能的操作：\n+* 任何类型的指针都可以转化为一个\b __unsafe.Pointer__ \n+* 一个 __unsafe.Pointer__ 可以转化成任何类型的指针\n+* 一个 __uintptr__ 可以转化成一个 __unsafe.Pointer__ \n+* 一个 __unsafe.Pointer__ 可以转化成一个 __uintptr__  \n+\n+这里主要\b关注两种\b只能借助 __unsafe__ 包才能完成的操作：使用 __unsafe.Pointer__ 实现两种类型间转换和使用 __unsafe.Pointer__ \b处理系统调用。\n+\n+## 使用 unsafe.Pointer 做类型转换\n+### 操作方式\n+可以简洁适宜的转换两个在内存中结构一样的类型是使用 __unsafe.Pointer__ 的一个主要原因。  \n+\n+文档描述：  \n+```\n+如果T2与T1\b一样大，并且两者有相同的内存结构；那么就允许把一个类型的数据，重新定义成另一个类型的数据\n+```\n+\n+经典的例子，是文档中的一次使用，用来实现 __math.Float64bits__ ： \n+```\n+func Float64bits(f float64) uint64 {\n+\treturn *(*uint64)(unsafe.Pointer(&f))\n+}\n+```\n+\n+这似乎是一种非常简洁的完成这样转换的方法，但是这个过程中具体发生了什么？让我们一步步拆分一下：\n+* __&f__ 拿到一个指向 __f__ 存放 __float64__ 值的指针。\n+* __unsafe.Pointer(&f)__ 将 __*float64__ 类型转化成了 __unsafe.Pointer__ 类型。\n+* __(*uint64)(unsafe.Pointer(&f))__ 将 __unsafe.Pointer__ 类型转化成了 __*uint64_。\n+* __*(*uint64)(unsafe.Pointer(&f))__ 引用这个 __*uint64__ 类型指针，转化为一个 __uint64__ 类型的值。\n+\n+第一个例子\b是下面过程的一个简洁表达：\n+```\n+func Float64bits(floatVal float64) uint64 {\n+\t// 获取一个指向存储这个float64类型值的指针。\n+\tfloatPtr := &floatVal\n+\n+\t// 转化*float64类型到unsafe.Pointer类型。\n+\tunsafePtr := unsafe.Pointer(floatPtr)\n+\n+\t// 转化unsafe.Pointer类型到*uint64类型.\n+\tuintPtr := (*uint64)(unsafePtr)\n+\n+\t// \b引用这个uint64指针，映射成一个uint64值\n+\tuintVal := *uintPtr\n+\n+\treturn uintVal\n+}\n+```\n+这是一个非常有用的操作，有些时候也是一个必要操作。\n+现在你已经理解了 __unsafe.Pointer__ \b是如何使用的，那么让我们\b再看一个真实的项目例子  \n+\n+### 现实列子：taskstats\n+我最近正在研究 [Linux 的 taskstats 接口](https://www.kernel.org/doc/Documentation/accounting/taskstats.txt)，我想了一个办法在Go中取到了内核的C的 __taskstats__ 结构。然后发送一个 __CL__ 把这个结构加到 x/sys/unix 中，我意识到这个结构实际上是如此的[庞大和复杂](https://godoc.org/golang.org/x/sys/unix#Taskstats)。  \n+为了使用这个结构，我需要\b从一个 byte\b 类型的切片中\b精确的分析每一个字段。\b更复杂的是，每一个 integer 类型在本地有序的存储，所以这些整数可能根据你的cpu在内存中以不同的格式存储。  \n+这个情况就非常适合使用使用简洁的 __unsafe.Pointer__ 转换，下面是我的写法：  \n+```\n+//\b \b\b通过这个包证实包含一个 unix.Taskstats 结构的byte\b类型的切片是预计的大小，我们不能盲目\b的将这个byte类型的切片放入一个错误\b尺寸的结构中。\n+const sizeofTaskstats = int(unsafe.Sizeof(unix.Taskstats{}))\n+\n+if want, got := sizeofTaskstats, len(buf); want != got {\n+\treturn nil, fmt.Errorf(\"unexpected taskstats structure size, want %d, got %d\", want, got)\n+}\n+\n+stats := *(*unix.Taskstats)(unsafe.Pointer(&buf[0]))\n+```\n+它是怎么做的？  \n+\n+首先，我通过参数传来的结构体实例，使用 __unsafe.Sizeof__，确定了该结构在内存中占有的准确的大小。  \n+\n+接下来，我确认需要转换的byte\b类型的切片大小和 __unix.Taskstats__ 结构大小一样，这样我就可以只读取我想要的数据块，而不是随意读取内存。  \n+最后，我使用 unsafe.Pointer 向 unix.Taskstats 结构转换。  \n+\n+但是，我为什么必须指定切片索引的0位置那？\n+如果你了解[切片的内部结构](https://blog.golang.org/go-slices-usage-and-internals)，你将知道一个切片实际上是一个头和一个指向底层数组的指针。当使用 __unsafe.Pointer__ 来转换切片数据时，必须指定数组\b第一个元素的内存地址，而不是切片本身的首地址。\n+\n+使用 __unsafe__ 使得转换非常的简洁、简单。因为整型数据根据我们的CPU以相同的字节顺序\b存储，使用 __unsafe.Pointer__ 转化意味着整型值是我们预期的。\n+\n+你可以去看看我 [taskstats](https://github.com/mdlayher/taskstats) 包中的代码。\n+\n+## 使用 unsafe.Pointer 处理系统调用\n+### 操作方式\n+当处理系统调用时，有些时候需要传入一个\b指向某块内存的指针给内核，以允许它执行某些任务。这是 __unsafe.Pointer__ \b在Go中另一个重要的使用场景。当需要处理系统调用时，就必须使用 __unsafe.Pointer__ ，因为为了使用 __syscall.Syscall__ 家族函数，它可以被转化成 __uintptr__ 类型。\n+\n+对于许多不同的操作系统，都拥有大量的系统调用。但是在这个例子中\b，我们将重点关注 __ioctl__ 。__ioctl__，在\bUNIX类系统中，经常被用来操作那些无法直接映射到典型的文件系统操作，例如读和写的文件描述符。事实上，由于 __ioctl__ 系统调用十分灵活，它并不在Go的 __syscall__ 或者 __x/sys/unix__ 包中。\n+\n+让我看看另一个真实的例子。\n+\n+### 现实例子：ioctl/vsock\n+在过去的几年里，Linux增加了一个新的 socket 家族，__AF_VSOCK__，它可以使管理中心和它的虚拟机之间\b双向，多对一的通信。  \n+\b这些套接字使用一个上下文ID进行通信。通过发送一个带有\b特殊请求号的 __ioctl__ 到 __/dev/vsock__ 驱动，可以\b取到这个上下文ID。 \n+\n+下面是 __ioctl__ \b函数的定义：  \n+```\n+func Ioctl(fd uintptr, request int, argp unsafe.Pointer) error {\n+\t_, _, errno := unix.Syscall(\n+\t\tunix.SYS_IOCTL,\n+\t\tfd,\n+\t\tuintptr(request),\n+\t\t// 在这个调用表达式中，从 unsafe.Pointer 到 uintptr 的转换是必须做的。详情\b可以查看 unsafe 包的文档\n+\t\tuintptr(argp),\n+\t)\n+\tif errno != 0 {\n+\t\treturn os.NewSyscallError(\"ioctl\", fmt.Errorf(\"%d\", int(errno)))\n+\t}\n+\n+\treturn nil\n+}\n+```  \n+像\b代码注释所写一样，在这种场景下使用 __unsafe.Pointer__ 有一个很重要的说明：  \n+```\n+在 syscall 包中的系统调用函数通过它们的 uintptr 类型\b\b参数直接操作系统，然后根据调用的详细情况，将它们中的一些转化为指针。换句话说，系统调用的执行，是其中某些参数从 uintptr 类型到指针类型的\b隐式\b转换。  \n+如果一个指针参数必须转换成 uintptr 才能使用，那么这种转换必须出现在表达式\b内部。\n+```  \n+但是为什么会这样？\b这是编辑器识别的特殊模式，本质上是指示垃圾收集器在函数调用完成之前，不能将被指针\u001D引用的内存再次安排。  ","path":"translated/tech/20171215-unsafe.Pointer and system calls.md","position":119,"original_position":119,"commit_id":"b166a5f04659e07b4a9dc92a3811b74715036030","original_commit_id":"b166a5f04659e07b4a9dc92a3811b74715036030","user":{"login":"polaris1119","id":899673,"avatar_url":"https://avatars1.githubusercontent.com/u/899673?v=4","gravatar_id":"","url":"https://api.github.com/users/polaris1119","html_url":"https://github.com/polaris1119","followers_url":"https://api.github.com/users/polaris1119/followers","following_url":"https://api.github.com/users/polaris1119/following{/other_user}","gists_url":"https://api.github.com/users/polaris1119/gists{/gist_id}","starred_url":"https://api.github.com/users/polaris1119/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/polaris1119/subscriptions","organizations_url":"https://api.github.com/users/polaris1119/orgs","repos_url":"https://api.github.com/users/polaris1119/repos","events_url":"https://api.github.com/users/polaris1119/events{/privacy}","received_events_url":"https://api.github.com/users/polaris1119/received_events","type":"User","site_admin":false},"body":"编辑器 -> 编译器","created_at":"2018-02-13T02:35:01Z","updated_at":"2018-02-13T02:38:32Z","html_url":"https://github.com/studygolang/GCTT/pull/337#discussion_r167747102","pull_request_url":"https://api.github.com/repos/studygolang/GCTT/pulls/337","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/comments/167747102"},"html":{"href":"https://github.com/studygolang/GCTT/pull/337#discussion_r167747102"},"pull_request":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/337"}}},"pull_request":{"url":"https://api.github.com/repos/studygolang/GCTT/pulls/337","id":168554360,"html_url":"https://github.com/studygolang/GCTT/pull/337","diff_url":"https://github.com/studygolang/GCTT/pull/337.diff","patch_url":"https://github.com/studygolang/GCTT/pull/337.patch","issue_url":"https://api.github.com/repos/studygolang/GCTT/issues/337","number":337,"state":"open","locked":false,"title":"完成翻译+unsafe.Pointer and system calls","user":{"login":"yiyulantian","id":4180226,"avatar_url":"https://avatars1.githubusercontent.com/u/4180226?v=4","gravatar_id":"","url":"https://api.github.com/users/yiyulantian","html_url":"https://github.com/yiyulantian","followers_url":"https://api.github.com/users/yiyulantian/followers","following_url":"https://api.github.com/users/yiyulantian/following{/other_user}","gists_url":"https://api.github.com/users/yiyulantian/gists{/gist_id}","starred_url":"https://api.github.com/users/yiyulantian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yiyulantian/subscriptions","organizations_url":"https://api.github.com/users/yiyulantian/orgs","repos_url":"https://api.github.com/users/yiyulantian/repos","events_url":"https://api.github.com/users/yiyulantian/events{/privacy}","received_events_url":"https://api.github.com/users/yiyulantian/received_events","type":"User","site_admin":false},"body":"#173 ","created_at":"2018-02-12T11:26:49Z","updated_at":"2018-02-13T02:38:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4ede315d49d218947087c934dff6d4b8b4c8cca4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/studygolang/GCTT/pulls/337/commits","review_comments_url":"https://api.github.com/repos/studygolang/GCTT/pulls/337/comments","review_comment_url":"https://api.github.com/repos/studygolang/GCTT/pulls/comments{/number}","comments_url":"https://api.github.com/repos/studygolang/GCTT/issues/337/comments","statuses_url":"https://api.github.com/repos/studygolang/GCTT/statuses/b166a5f04659e07b4a9dc92a3811b74715036030","head":{"label":"yiyulantian:master","ref":"master","sha":"b166a5f04659e07b4a9dc92a3811b74715036030","user":{"login":"yiyulantian","id":4180226,"avatar_url":"https://avatars1.githubusercontent.com/u/4180226?v=4","gravatar_id":"","url":"https://api.github.com/users/yiyulantian","html_url":"https://github.com/yiyulantian","followers_url":"https://api.github.com/users/yiyulantian/followers","following_url":"https://api.github.com/users/yiyulantian/following{/other_user}","gists_url":"https://api.github.com/users/yiyulantian/gists{/gist_id}","starred_url":"https://api.github.com/users/yiyulantian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yiyulantian/subscriptions","organizations_url":"https://api.github.com/users/yiyulantian/orgs","repos_url":"https://api.github.com/users/yiyulantian/repos","events_url":"https://api.github.com/users/yiyulantian/events{/privacy}","received_events_url":"https://api.github.com/users/yiyulantian/received_events","type":"User","site_admin":false},"repo":{"id":118437718,"name":"GCTT","full_name":"yiyulantian/GCTT","owner":{"login":"yiyulantian","id":4180226,"avatar_url":"https://avatars1.githubusercontent.com/u/4180226?v=4","gravatar_id":"","url":"https://api.github.com/users/yiyulantian","html_url":"https://github.com/yiyulantian","followers_url":"https://api.github.com/users/yiyulantian/followers","following_url":"https://api.github.com/users/yiyulantian/following{/other_user}","gists_url":"https://api.github.com/users/yiyulantian/gists{/gist_id}","starred_url":"https://api.github.com/users/yiyulantian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yiyulantian/subscriptions","organizations_url":"https://api.github.com/users/yiyulantian/orgs","repos_url":"https://api.github.com/users/yiyulantian/repos","events_url":"https://api.github.com/users/yiyulantian/events{/privacy}","received_events_url":"https://api.github.com/users/yiyulantian/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/yiyulantian/GCTT","description":"GCTT Go中文网翻译组。","fork":true,"url":"https://api.github.com/repos/yiyulantian/GCTT","forks_url":"https://api.github.com/repos/yiyulantian/GCTT/forks","keys_url":"https://api.github.com/repos/yiyulantian/GCTT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yiyulantian/GCTT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yiyulantian/GCTT/teams","hooks_url":"https://api.github.com/repos/yiyulantian/GCTT/hooks","issue_events_url":"https://api.github.com/repos/yiyulantian/GCTT/issues/events{/number}","events_url":"https://api.github.com/repos/yiyulantian/GCTT/events","assignees_url":"https://api.github.com/repos/yiyulantian/GCTT/assignees{/user}","branches_url":"https://api.github.com/repos/yiyulantian/GCTT/branches{/branch}","tags_url":"https://api.github.com/repos/yiyulantian/GCTT/tags","blobs_url":"https://api.github.com/repos/yiyulantian/GCTT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yiyulantian/GCTT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yiyulantian/GCTT/git/refs{/sha}","trees_url":"https://api.github.com/repos/yiyulantian/GCTT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yiyulantian/GCTT/statuses/{sha}","languages_url":"https://api.github.com/repos/yiyulantian/GCTT/languages","stargazers_url":"https://api.github.com/repos/yiyulantian/GCTT/stargazers","contributors_url":"https://api.github.com/repos/yiyulantian/GCTT/contributors","subscribers_url":"https://api.github.com/repos/yiyulantian/GCTT/subscribers","subscription_url":"https://api.github.com/repos/yiyulantian/GCTT/subscription","commits_url":"https://api.github.com/repos/yiyulantian/GCTT/commits{/sha}","git_commits_url":"https://api.github.com/repos/yiyulantian/GCTT/git/commits{/sha}","comments_url":"https://api.github.com/repos/yiyulantian/GCTT/comments{/number}","issue_comment_url":"https://api.github.com/repos/yiyulantian/GCTT/issues/comments{/number}","contents_url":"https://api.github.com/repos/yiyulantian/GCTT/contents/{+path}","compare_url":"https://api.github.com/repos/yiyulantian/GCTT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yiyulantian/GCTT/merges","archive_url":"https://api.github.com/repos/yiyulantian/GCTT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yiyulantian/GCTT/downloads","issues_url":"https://api.github.com/repos/yiyulantian/GCTT/issues{/number}","pulls_url":"https://api.github.com/repos/yiyulantian/GCTT/pulls{/number}","milestones_url":"https://api.github.com/repos/yiyulantian/GCTT/milestones{/number}","notifications_url":"https://api.github.com/repos/yiyulantian/GCTT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yiyulantian/GCTT/labels{/name}","releases_url":"https://api.github.com/repos/yiyulantian/GCTT/releases{/id}","deployments_url":"https://api.github.com/repos/yiyulantian/GCTT/deployments","created_at":"2018-01-22T09:47:53Z","updated_at":"2018-01-22T09:47:55Z","pushed_at":"2018-02-12T11:35:03Z","git_url":"git://github.com/yiyulantian/GCTT.git","ssh_url":"git@github.com:yiyulantian/GCTT.git","clone_url":"https://github.com/yiyulantian/GCTT.git","svn_url":"https://github.com/yiyulantian/GCTT","homepage":"https://studygolang.com/gctt","size":5523,"stargazers_count":0,"watchers_count":0,"language":"Shell","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"studygolang:master","ref":"master","sha":"4299c970b6e8de094a6e32fa91d33bf52ce54b78","user":{"login":"studygolang","id":3772217,"avatar_url":"https://avatars3.githubusercontent.com/u/3772217?v=4","gravatar_id":"","url":"https://api.github.com/users/studygolang","html_url":"https://github.com/studygolang","followers_url":"https://api.github.com/users/studygolang/followers","following_url":"https://api.github.com/users/studygolang/following{/other_user}","gists_url":"https://api.github.com/users/studygolang/gists{/gist_id}","starred_url":"https://api.github.com/users/studygolang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/studygolang/subscriptions","organizations_url":"https://api.github.com/users/studygolang/orgs","repos_url":"https://api.github.com/users/studygolang/repos","events_url":"https://api.github.com/users/studygolang/events{/privacy}","received_events_url":"https://api.github.com/users/studygolang/received_events","type":"Organization","site_admin":false},"repo":{"id":110936509,"name":"GCTT","full_name":"studygolang/GCTT","owner":{"login":"studygolang","id":3772217,"avatar_url":"https://avatars3.githubusercontent.com/u/3772217?v=4","gravatar_id":"","url":"https://api.github.com/users/studygolang","html_url":"https://github.com/studygolang","followers_url":"https://api.github.com/users/studygolang/followers","following_url":"https://api.github.com/users/studygolang/following{/other_user}","gists_url":"https://api.github.com/users/studygolang/gists{/gist_id}","starred_url":"https://api.github.com/users/studygolang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/studygolang/subscriptions","organizations_url":"https://api.github.com/users/studygolang/orgs","repos_url":"https://api.github.com/users/studygolang/repos","events_url":"https://api.github.com/users/studygolang/events{/privacy}","received_events_url":"https://api.github.com/users/studygolang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/studygolang/GCTT","description":"GCTT Go中文网翻译组。","fork":false,"url":"https://api.github.com/repos/studygolang/GCTT","forks_url":"https://api.github.com/repos/studygolang/GCTT/forks","keys_url":"https://api.github.com/repos/studygolang/GCTT/keys{/key_id}","collaborators_url":"https://api.github.com/repos/studygolang/GCTT/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/studygolang/GCTT/teams","hooks_url":"https://api.github.com/repos/studygolang/GCTT/hooks","issue_events_url":"https://api.github.com/repos/studygolang/GCTT/issues/events{/number}","events_url":"https://api.github.com/repos/studygolang/GCTT/events","assignees_url":"https://api.github.com/repos/studygolang/GCTT/assignees{/user}","branches_url":"https://api.github.com/repos/studygolang/GCTT/branches{/branch}","tags_url":"https://api.github.com/repos/studygolang/GCTT/tags","blobs_url":"https://api.github.com/repos/studygolang/GCTT/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/studygolang/GCTT/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/studygolang/GCTT/git/refs{/sha}","trees_url":"https://api.github.com/repos/studygolang/GCTT/git/trees{/sha}","statuses_url":"https://api.github.com/repos/studygolang/GCTT/statuses/{sha}","languages_url":"https://api.github.com/repos/studygolang/GCTT/languages","stargazers_url":"https://api.github.com/repos/studygolang/GCTT/stargazers","contributors_url":"https://api.github.com/repos/studygolang/GCTT/contributors","subscribers_url":"https://api.github.com/repos/studygolang/GCTT/subscribers","subscription_url":"https://api.github.com/repos/studygolang/GCTT/subscription","commits_url":"https://api.github.com/repos/studygolang/GCTT/commits{/sha}","git_commits_url":"https://api.github.com/repos/studygolang/GCTT/git/commits{/sha}","comments_url":"https://api.github.com/repos/studygolang/GCTT/comments{/number}","issue_comment_url":"https://api.github.com/repos/studygolang/GCTT/issues/comments{/number}","contents_url":"https://api.github.com/repos/studygolang/GCTT/contents/{+path}","compare_url":"https://api.github.com/repos/studygolang/GCTT/compare/{base}...{head}","merges_url":"https://api.github.com/repos/studygolang/GCTT/merges","archive_url":"https://api.github.com/repos/studygolang/GCTT/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/studygolang/GCTT/downloads","issues_url":"https://api.github.com/repos/studygolang/GCTT/issues{/number}","pulls_url":"https://api.github.com/repos/studygolang/GCTT/pulls{/number}","milestones_url":"https://api.github.com/repos/studygolang/GCTT/milestones{/number}","notifications_url":"https://api.github.com/repos/studygolang/GCTT/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/studygolang/GCTT/labels{/name}","releases_url":"https://api.github.com/repos/studygolang/GCTT/releases{/id}","deployments_url":"https://api.github.com/repos/studygolang/GCTT/deployments","created_at":"2017-11-16T07:10:44Z","updated_at":"2018-02-12T16:55:59Z","pushed_at":"2018-02-12T11:35:05Z","git_url":"git://github.com/studygolang/GCTT.git","ssh_url":"git@github.com:studygolang/GCTT.git","clone_url":"https://github.com/studygolang/GCTT.git","svn_url":"https://github.com/studygolang/GCTT","homepage":"https://studygolang.com/gctt","size":5518,"stargazers_count":295,"watchers_count":295,"language":"Shell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":124,"mirror_url":null,"archived":false,"open_issues_count":33,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":124,"open_issues":33,"watchers":295,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/337"},"html":{"href":"https://github.com/studygolang/GCTT/pull/337"},"issue":{"href":"https://api.github.com/repos/studygolang/GCTT/issues/337"},"comments":{"href":"https://api.github.com/repos/studygolang/GCTT/issues/337/comments"},"review_comments":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/337/comments"},"review_comment":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/studygolang/GCTT/pulls/337/commits"},"statuses":{"href":"https://api.github.com/repos/studygolang/GCTT/statuses/b166a5f04659e07b4a9dc92a3811b74715036030"}},"author_association":"NONE"}}
{"actor":{"display_login":"polaris1119"}}