• Go语言处理Json数据

    JSON 是目前最为流行的序列化手段,Go 语言内置 encoding/json 包用于 JSON 序列化 / 反序列化 操作。本文以详细代码示例,演示 encoding/json 包的使用方式。

    序列化

    对于已有类型,序列化只需一行代码:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    package main
    
    import (
        "encoding/json"
        "fmt"
        "log"
    )
    
    type Pair struct {
        Name string
        Value int
    }
    
    func main() {
        pair := Pair{
            Name: "bar",
            Value: 1,
        }
    
        content, err := json.Marshal(pair)
        if err == nil {
            fmt.Printf("%s\n", content)
        } else {
            log.Fatal(pair)
        }
    }
    
    阅读全文
  • Go语言提供HTTP服务

    发起HTTP请求 一文介绍了如何使用 net/http 包发起 HTTP 请求。net/http 包同样提供了用于开发实现 HTTP 服务的基础类库,本文将进一步介绍如何使用这些类库。

    先来看看一个简单的例子——计数器服务接口。这个接口非常简单,每次均返回接口调用总次数,以 1 开始:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    package main
    
    import (
        "fmt"
        "log"
        "net/http"
    )
    
    var counter = 0
    
    type CounterHandler struct {}
    
    func (handler CounterHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
        counter += 1
        fmt.Fprintln(writer, counter)
    }
    
    func main() {
        server := &http.Server{
            Addr: ":8080",
            Handler: CounterHandler{},
        }
    
        log.Fatal(server.ListenAndServe())
    }
    
    阅读全文
  • Go语言发起HTTP请求

    在日常开发中,发起 HTTP 请求是一个非常频繁的任务。

    Go 语言提供了 net/http 包,协助用户实施与 HTTP 协议相关的开发任务。该包既提供了 HTTP 服务器 实现,又提供了 客户端 实现。

    本文介绍如何使用 net/http 包发起 HTTP 请求,覆盖大部分应用场景:

    Get请求

    发起 Get 请求是最常见的场景之一,使用 http.Get 函数即可。代码示例如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    package main
    
    import (
        "fmt"
        "net/http"
        "io/ioutil"
    )
    
    func main() {
        rsps, err := http.Get("http://example.com")
        if err != nil {
            fmt.Println("Request failed:", err)
            return
        }
        defer rsps.Body.Close()
    
        body, err := ioutil.ReadAll(rsps.Body)
        if err != nil {
            fmt.Println("Read body failed:", err)
            return
        }
    
        fmt.Println(string(body))
    }
    
    阅读全文
  • Go语言如何调用C函数

    相对而言,Go 语言还是一门非常年轻的语言。虽然发展迅猛,局限性也有——类库不是特别丰富。有些开源项目,例如 x264 ,只有 C 语言版本, Go 重写一遍也不太现实。

    好在 Go 提供了调用 C 函数的机制—— cgo ,本文用一个实际例子演示如何使用 cgo 调用 C 函数。

    被调用库函数

    为了演示需要,虚设一个名为 callee 的函数库。函数库只提供一个名为 sayHello 的函数,接口如头文件 callee.h 所示:

    1
    
    void SayHello();
    

    sayHello 函数只是简单输出 Hello, world! ,实现见源文件 callee.c

    1
    2
    3
    4
    5
    6
    
    #include <stdio.h>
    #include "callee.h"
    
    void SayHello() {
        printf("Hello, world!\n");
    }
    

    接下来,将上述代码编译成动态库:

    1
    2
    3
    
    $ gcc -fPIC -c callee.c
    $ ls
    Makefile  callee.c  callee.h  callee.o  caller.go
    
    阅读全文