标签归档:Go

Go中的net/url包学习笔记

GO中的net/url包,实现对URL的处理。

1、对URL进行编码和解码

func QueryEscape(s string) string
QueryEscape函数对s进行转码使之可以安全的用在URL查询里。

func QueryUnescape(s string) (string, error)
QueryUnescape函数用于将QueryEscape转码的字符串还原。它会把%AB改为字节0xAB,将’+’改为’ ‘。如果有某个%后面未跟两个十六进制数字,本函数会返回错误。

继续阅读

Go中net包中的方法

本文章是学习Go中net包的一篇笔记,记录 net 包的一些方法的使用。

 1、func SplitHostPort(hostport string) (host, port string, err error)

函数将格式为”host:port”、”[host]:port”或”[ipv6-host%zone]:port”的网络地址分割为host或ipv6-host%zone和port两个部分。

继续阅读

如何优雅地关闭Go channel

几天前,我写了一篇文章来说明golang中channel的使用规范。在reddit和HN,那篇文章收到了很多赞同,但是我也收到了下面几个关于Go channel设计和规范的批评:

  1. 在不能更改channel状态的情况下,没有简单普遍的方式来检查channel是否已经关闭了
  2. 关闭已经关闭的channel会导致panic,所以在closer(关闭者)不知道channel是否已经关闭的情况下去关闭channel是很危险的
  3. 发送值到已经关闭的channel会导致panic,所以如果sender(发送者)在不知道channel是否已经关闭的情况下去向channel发送值是很危险的

继续阅读

Goroutine和channel的详细理解(二)

  • Go语言的并发和并行

不知道你有没有注意到一个现象,还是这段代码,如果我跑在两个goroutines里面的话:

var quit chan int = make(chan int)
func loop() {
    for i := 0; i < 10; i++ {
        fmt.Printf("%d ", i)
    }
    quit <- 0
}
func main() {
    go loop()   // 开两个goroutine跑函数loop, loop函数负责打印10个数
    go loop()
    for i := 0; i < 2; i++ {
        <- quit
    }
}

继续阅读

Goroutine和channel的详细理解(一)

如果不是我对真正并行的线程的追求,就不会认识到Go有多么的迷人。

Go语言从语言层面上就支持了并发,这与其他语言大不一样,不像以前我们要用Thread库 来新建线程,还要用线程安全的队列库来共享数据。

以下是我入门的学习笔记。

继续阅读

Go新建文件权限与设置不符

问题:

fileName := "/Users/my/tests/perm_file"
f, _ := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
f.Close()

上述代码是打开一个文件,如果文件不存在则创建一个新文件,同时权限设置为0666(-rw-rw-rw-),但实际生成的文件权限可能与你认为的不一致:

继续阅读

GO中new 和 make的区别

一、make

make 只能为 slice、map或 channel 类型分配内存并初始化,同时返回一个有初始值的 slice、map 或 channel 类型引用,不是指针。

继续阅读

Go的web应用需要注意的点

fmt.Fprintf(w, “hello world!”)

w.Write([]byte(“test”))

http.Redirect(w, r, “124.100.com/test/a/b/”,301)

io.WriteString(w, “hello, world!hello, world!\n”)

GO中的互斥锁与读写锁

在本节,我们对Go语言所提供的与锁有关的API进行说明。这包括了互斥锁和读写锁。我们在第6章描述过互斥锁,但却没有提到过读写锁。这两种锁对于传统的并发程序来说都是非常常用和重要的。

继续阅读

GO中数组与切片的区别

Go语言中的数组大概相当与C/C++中的数组,固定大小,不能够动态扩展大小,而切片大概相当与C++中的Vector,可以动态扩展大小,当大小超过容量时,重新分配一块内存,然后将数据复制到新的内存区域。下面我们通过几个问题来更好理解golang 的数组和切片,一起来看看吧。

继续阅读