hello world

main.go

1
2
3
4
5
6
7
8
9
package main

import (
	"fmt"
)

func main(){
	fmt.Println("hello, world")
}

编译、生成执行文件、运行: go run main.go

编译: go build main.go

命令行参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package main

import (
	"fmt"
	"os"
)

func main(){
	for i:=0; i<len(os.Args); i++{
		fmt.Println(os.Args[i])
	}
}

运行命令: go run mian.go a b c

输出

1
2
3
4
/tmp/go-build536683647/b001/exe/main
a
b
c

查找重复的行

获取url

 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"
	"io/ioutil"
	"net/http"
	"os"
)

func main(){
	for _, url := range os.Args[1:]{
		resp, err := http.Get(url)
		if err != nil{
			fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
			os.Exit(1)
		}
		b, err := ioutil.ReadAll(resp.Body)
		resp.Body.Close()
		if err != nil {
			fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
			os.Exit(1)
		}
		fmt.Printf("%s", b)
	}
}

运行命令:go run main.go https://www.baidu.com

  • ioutil.ReadAll()接受一个io.Reader
  • 记得关闭resp

并发获取url

 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
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"net/http"
	"os"
	"time"
)

func main(){
	start := time.Now()
	ch := make(chan string)
	for _, url := range os.Args[1:] {
		go fetch(url, ch)
	}

	for range os.Args[1:] {
		fmt.Println(<-ch)
	}
	fmt.Printf("%.2fs elapsed\n", time.Since(start).Seconds())
}

func fetch(url string, ch chan string ){
	start := time.Now()
	resp, err := http.Get(url)
	if err != nil {
		ch<- fmt.Sprint(err)
		return
	}
	nbytes, err := io.Copy(ioutil.Discard, resp.Body)
	if err != nil {
		ch <- fmt.Sprint(err)
	}

	duration := time.Since(start).Seconds()
	ch <- fmt.Sprintf("%.2f %7d %s", duration, nbytes, url)
}

运行命令:go run main.go https://www.baidu.com 运行结果:

1
2
0.27     227 https://www.baidu.com
0.27s elapsed
  • time.Since().Seconds() 用来计算间隔
  • ch会阻塞,防止主线程退出
  • 使用io.Copy(dst, src)从src拷贝到dst,并返回拷贝个数
  • ioutil.Discard 接收到信息并抛弃

web服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package main

import (
	"fmt"
	"log"
	"net/http"
)

func main(){
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe("localhost:8000", nil))

}

func handler(w http.ResponseWriter, r *http.Request){
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

开启一个server,监听了"/“路径,该路径的处理函数是handler, handler里接受响应和请求两个参数,然后将Path作为响应的内容。