不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2017-11-19 18:21:16  修改时间:2025-04-23 18:01:09  分类:14.Golang/Ruby  编辑

Golang 内建的 close 方法可以关闭 channel,如果往已经关闭的 channel 发送数据,则会报错:panic: close of closed channel.

看如下代码,在一段时间内,生产者可以不断往 channel 写入数据,消费者进行处理,一段时间后 channel 关闭了,这个时候如果还有数据往 channel 发送,程序就会报错。

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	jobs := make(chan int)
	var wg sync.WaitGroup
	go func() {
		time.Sleep(time.Second * 3)
		close(jobs)
	}()
	go func() {
		for i := 0; ; i++ {
			jobs <- i
			fmt.Println("produce:", i)
		}
	}()
	wg.Add(1)
	go func() {
		defer wg.Done()
		for i := range jobs {
			fmt.Println("consume:", i)
		}
	}()
	wg.Wait()
}
作者:AlbertWen  添加时间:2017-10-29 09:52:40  修改时间:2025-04-29 16:31:15  分类:14.Golang/Ruby  编辑

请求的结构

HTTP 的交互以请求和响应的应答模式。Go 的请求我们早就见过了,handler 函数的第二个参数 http.Requests。其结构为:

type Request struct {
    Method string

    URL *url.URL
    Proto      string // "HTTP/1.0"
    ProtoMajor int    // 1
    ProtoMinor int    // 0
    Header Header
    Body io.ReadCloser
    ContentLength int64
    TransferEncoding []string
    Close bool
    Host string
    Form url.Values
    PostForm url.Values
    MultipartForm *multipart.Form
  ....
    ctx context.Context
}

从 request 结构可以看到,http 请求的基本信息都囊括了。对于请求而言,主要关注一下请求的 URL,Method,Header,Body 这些结构。

作者:AlbertWen  添加时间:2017-10-29 20:33:42  修改时间:2025-04-24 02:44:19  分类:14.Golang/Ruby  编辑

Go 的 flag 包可以解析命令行的参数。

 一、命令行语法

命令行语法主要有以下几种形式:

cmd -flag       // 只支持bool类型
cmd -flag=xxx
cmd -flag xxx   // 只支持非bool类型

作者:AlbertWen  添加时间:2017-10-29 10:15:23  修改时间:2025-04-30 00:37:25  分类:14.Golang/Ruby  编辑

go list 命令的作用是列出指定的 代码包 的信息。与其他命令相同,我们需要以 代码包导入路径 的方式给定代码包。被给定的代码包可以有多个。这些代码包对应的目录中必须直接保存有 Go 语言源码文件,其子目录中的文件不算在内。否则,代码包将被看做是不完整的。现在我们来试用一下:

hc@ubt:~$ go list cnet/ctcp pkgtool
cnet/ctcp
pkgtool
作者:AlbertWen  添加时间:2017-10-27 12:53:51  修改时间:2025-05-01 00:10:04  分类:14.Golang/Ruby  编辑

Go语言里面设计最精妙的应该算interface,它让面向对象,内容组织实现非常的方便,当你看完这一章,你就会被interface的巧妙设计所折服。

什么是interface

简单的说,interface是一组method签名的组合,我们通过interface来定义对象的一组行为。

我们前面一章最后一个例子中Student和Employee都能SayHi,虽然他们的内部实现不一样,但是那不重要,重要的是他们都能say hi

让我们来继续做更多的扩展,Student和Employee实现另一个方法Sing,然后Student实现方法BorrowMoney而Employee实现SpendSalary。

这样Student实现了三个方法:SayHi、Sing、BorrowMoney;而Employee实现了SayHi、Sing、SpendSalary。

作者:AlbertWen  添加时间:2017-10-29 10:18:13  修改时间:2025-04-19 08:17:38  分类:14.Golang/Ruby  编辑

我们可以使用 go tool pprof 命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。

在 Go 语言中,我们可以通过标准库的代码包 runtime 和 runtime/pprof 中的程序来生成三种包含实时性数据的概要文件,分别是 CPU 概要文件、内存概要文件 和 程序阻塞概要文件。下面我们先来分别介绍用于生成这三种概要文件的 API 的用法。

作者:AlbertWen  添加时间:2017-10-27 12:59:47  修改时间:2025-04-30 23:16:01  分类:14.Golang/Ruby  编辑

Go template包下面有两个函数可以创建模板实例

func New(name string) *Template  
func ParseFiles(filenames ...string) (*Template, error)   

首先要说的是每一个template内部可以存储多个模板,而且每个模板必须对应一个独立的名字。

两个的不同点在于:

1、使用 New() 在创建时就为其添加一个模板名称,并且执行 t.Execute() 会默认去寻找该名称进行数据融合;

2、使用 ParseFiles() 创建模板可以一次指定多个文件加载多个模板进来,但是就不可以使用 t.Execute() 来执行数据融合;

作者:AlbertWen  添加时间:2017-10-29 10:12:05  修改时间:2025-04-19 10:50:18  分类:14.Golang/Ruby  编辑
hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging

命令 go get 可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。在上面这个示例中,我们从著名的代码托管站点 Github 上下载了一个项目(或称代码包),并安装到了环境变量 GOPATH 中包含的第一个工作区中。与此同时,我们也知道了这个代码包的导入路径就是 github.com/hyper-carrot/go_lib/logging

作者:AlbertWen  添加时间:2017-10-29 09:44:39  修改时间:2025-05-01 00:06:07  分类:14.Golang/Ruby  编辑

一、基本类型

清晰完备的预定义基础类型,使得开发跨平台应用时无须过多考虑符合和长度差异。

类型 长度 默认值 说明
bool 1 false  
byte 1 0 uint8
int, uint 4, 8 0 默认整数类型,依据目标平台,32 或 64 位
int8, uint8 1 0 -128 ~ 127,0 ~ 125
int16, uint16 2 0 -32,768 ~ 32,767,0 ~ 65,535
int32, uint32 4 0 -21亿 ~ 21亿,0 ~ 42亿
int64, uint64 8 0  
float32 4 0.0  
float64 8 0.0 默认浮点数类型
作者:AlbertWen  添加时间:2017-10-29 10:06:15  修改时间:2025-04-30 22:58:52  分类:14.Golang/Ruby  编辑

命令 go install 用于编译并安装指定的代码包及它们的依赖包。当指定的代码包的依赖包还没有被编译和安装时,该命令会先去处理依赖包。与 go build 命令一样,传给 go install 命令的代码包参数应该以导入路径的形式提供。并且,go build 命令的绝大多数标记也都可以用于 go install 命令。实际上,go install 命令只比 go build 命令多做了一件事,即:安装编译后的结果文件到指定目录。