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作为响应的内容。