Go语言命令行参数字传送递和轻便http服务器实例

作者: 韦德国际1946手机版  发布:2019-06-16
package main

import (
    "flag"
    "io"
    "log"
    "net/http"
)

var (
    host = flag.String("host", "127.0.0.1", "listen host")
    port = flag.String("port", ":9000", "listen port")
)

func init() {
    flag.Parse()
}

func flagHandle(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "input: " *host ":" *port)
}

func main() {
    http.HandleFunc("/", flagHandle)
    err := http.ListenAndServe(*host ":" *port, nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

// go run main.go --host 127.0.0.1 --port 8080
//该片段来自于http://outofmemory.cn

叁个极漂亮妙的三个主题材料。从上面的代码能够看来:

select 实例

Go 语言选用(select)能够等待八个通道操作。将 goroutineGo语言命令行参数字传送递和轻便http服务器实例,关于Go语言中数组的参数字传送递难点。 和 channelselect 结合是 Go 语言的贰个有力成效。看起来可能和 switch 相似,可是并不是。

对于这么些示例,将采纳多个通道。

各种通道将要一段时间后早先接收值,以模拟阻塞在并发 goroutines 中执行 RPC 操作。大家将利用 select 同不常候等待那八个值,在各种值到达时打字与印刷它们。

实行实例程序获得的值是 one , 然后是 two 。注意,总奉行时间唯有1-2 秒 Sleeps 同期实施。

package main
import (
    "fmt"
    "time"
)

func main(){
    // channel
    c1 := make (chan string)
    c2 := make (chan string)

    go func(){
        time.Sleep(time.Second * 1)
        c1 <- "ONE"
    }()

    go func(){
        time.Sleep(time.Second * 2)
        c2 <- "TWO"
    }()

    for i := 0 ; i < 2 ; i    {
        select {
            case msg1 := <-c1:
            fmt.Println("received~one",msg1)
            case msg2 := <-c2:
            fmt.Println("received~two",msg2)
        }
    }
}

本节重大分享:文件读取、文件写入、线过滤器、命令行参数、命令行标志

1、类型为“[5]int”的数组在作为参数时,其实作为值来传递的。

超时(timeouts)实例

逾期对于一而再到表面能源或在无需绑定施行时间的顺序很要紧。在 Go 编制程序中出于选择了大路和采取 (select),达成超时是很轻便和优雅的。

在那个示例中,要是正在试行二个表面调用,2秒后在通道 C1 上回来其结果。

这里是 select 完成超时。res := <-c1 等候结果和 <-Time 。等待在超时 1 秒后发送三个值。由于选项继续计划好第二个接收,倘诺超时当先允许的 1 秒,则将遵守超时情况管理。

假设同意更加长的晚点,如: 3s ,那么从 c2 的接受将打响,这里将会打字与印刷。

运维此程序显示第二个操作超时和第二个操作超时。

动用此选用超时形式必要经过通道传达结果。那是三个好主意,因为其它重大的 Go 作用是基于路子和 Select。今后探视下边包车型地铁五个例子:机械漏刻和ticker 。

package main
import (
    "time"
    "fmt" 
)
func main(){
    c1 := make(chan string,1)
    go func(){
        time.Sleep(time.Second *2)
        c1 <- "result 1"
    }()
    select {
        case res := <-c1:
        fmt.Println(res)
        case <-time.After(time.Second *1):
        fmt.Println("timeout 1")
    }
    c2 := make(chan string , 1)
    go func() {
        time.Sleep(time.Second * 2)
        c2 <- "result 2"
    }()
    select {
        case res := <-c2:
        fmt.Println(res)
        case <-time.After(time.Second *3):
        fmt.Println("timeout2")
    }
}

以下代码在存放于github中如下旅社:github

2、 类型为“[]int”的数组在作为参数时,其实作为引用来传递的。

非阻塞通道操作实例

通道的为主出殡和埋葬和收受都过不去。不过,能够动用 selectdefault 子句来促成非阻塞发送,接收,以致非阻塞多路采用( select )。

此地会是二个非阻塞接收。要是新闻上有可用的值,则接纳将使用该值的 <-message 。若是还是不是,它会立马接纳私下认可情形。

能够采取多少个地点的暗中认可子句来促成多路非阻塞采取(select)。这里品尝对音信(message) 和实信号(signals) 的非阻塞接收。

package main

import (
    "fmt"
    "time"
)

func main(){
    messages := make(chan string)
    signals  := make(chan bool)

    go func() {
        messages <- "test"
    }()

    time.Sleep(time.Second * 1)
    select{
        case msg := <-messages:
            fmt.Println("Received message",msg)
        default:
            fmt.Println("no message received")
    }

    msg := "hi"

    select {
        case messages<-msg:
            fmt.Println("sent message",msg)
        default:
            fmt.Println("no message sent")
    }

    select {
        case msg := <- messages:
            fmt.Println("received message",msg)
        case sig := <-signals:
            fmt.Println("received signals",sig)
        default:
            fmt.Println("no activity")
    }
}

先后的基本功效之一正是文件的操作,这里提供二个思路是Go 读取文件,文件读取时候供给开始展览错误决断。

这是由于“[]int”是一个接口么?待分明。

go 关闭通道实例

闭馆通道表示不会再发送值。那对于将做到报纸发表到大路的接收器是很有用的。

在这一个例子中,大家将运用贰个作业通道来造成从 main goroutine 到 worker goroutine 的行事。当未有越来越多的办事时,则将关闭专门的学业通道。

此间是办事程序 goroutine。它往往从j的行事接收 more := <- jobs 。在这种新鲜的 2 值方式的接收中。倘诺作业已关闭并且接受到的大道中的所有值,则 more 的值将为 false。当已经完毕了有着的工作时,使用这些通知。

那会经过作业通道向工作线程发送 3 个作业,然后关门它。

package main

import "fmt"

func main(){
    jobs := make(chan int,5)
    done := make(chan bool)

    go func() {
        for {
            j , more := <- jobs
            if more{
                fmt.Println("received job",j)
            }else {
                fmt.Println("received all jobs")
                done <- true
                return
            }
        }
    }()

    for j:=1 ; j<= 3 ; j  {
        jobs <- j
        fmt.Println("send job",j)
    }

    //关闭通道
    close(jobs)
    fmt.Println("send all jobs")

    //
    fmt.Println(<-done)
}

如上例程中实际出口的时候蒙受输出为以下样子:

"D:ProgramGogland 172.3757.2binrunnerw.exe" C:Gobingo.exe run C:/Go/MyGo/src/lesson5_select/close_chan.go
send job 1
send job 2
received job 1
received job 2
received job 3
send job 3
send all jobs
received all jobs
true

民用估摸是因为 goroutine 中实行的线程调解的时候快于 首要routine。所以出现上述输出,可是正是实在实行进程的时候自然是摄取到发送过后再出口。

package mainimport ( "io/ioutil" "fmt" "os" "bufio")// 读取文件需要检查大多数的调用错误// 这个函数帮助简化错误检查func check{ if e != nil { panic }}func main(){ //最基本的文件读取到内存中 dat , err := ioutil.ReadFile("test.log") check fmt.Print(string //通过得到文件句柄值,可以更好的控制文件的读取。 f,err := os.Open("test.log") check //读取到一个5字节的数组中 b1 := make n1,err:=f.Read check fmt.Printf("%d bytes: %sn",n1,string //找到一个已知位置然后读取 o2 , err := f.Seek check b2 := make n2,err := f.Read check fmt.Printf("%d bytes @ %d: %sn",n2,o2,string //没有内置的倒带,但是 Seek 可以实现这一点 _,err = f.Seek check //bufio 包提供了一个缓冲的读取器,因为它具有许多小文件读取的效率,并且提供了额外的读取方式 //适当使用可以提到程序性能。 r4 := bufio.NewReader b4,err := r4.Peek check fmt.Printf("5 bytes: %sn",string //关闭文件 f.Close()}

代码片段的1的运维结果:

go 通道范围实例

在头里的例子中,大家已经看到了 forrange 语句如何为基于数据结构提供迭代。还能运用此语法对从通路接收的值实行迭代。

此限制在从队列中抽取到的每一种成分上开始展览迭代。因为关闭了上面的坦途,迭代在收受到 2 个因素后终止。

以此示例还是能够关闭非空信道,但仍接收剩余值。

package main

import "fmt"

func main(){
    //存放两个值在通道中

    queue := make(chan string,2)
    queue <- "one"
    queue <- "two"

    close(queue)

    for elem:=range queue{
        fmt.Println(elem)
    }
}

输出结果如下:

"D:ProgramGogland 172.3757.2binrunnerw.exe" C:Gobingo.exe run C:/Go/MyGo/src/lesson5_select/chan_range.go
one
two

在Go普通话件的读取和写入情势类似。写入文件一律供给检讨大许多的调用错误。

本文由韦德国际1946发布于韦德国际1946手机版,转载请注明出处:Go语言命令行参数字传送递和轻便http服务器实例

关键词: Golang 基础 我用 Linux 实例 语言

上一篇:七款主流PHP框架的利弊评比
下一篇:没有了