1.命令行参数
package main
import (
"flag"
"fmt"
)
func main() {
// 定义一个 string 类型的命令行参数
name := flag.String("name", "world", "a name to greet")
// 定义一个 int 类型的命令行参数
age := flag.Int("age", 25, "your age")
// 解析命令行参数
flag.Parse()
// 打印结果
fmt.Printf("Hello, %s! You are %d years old.\n", *name, *age)
}
go run main.go -name "nihao" -age 20
go build -o main.exe & ./main.exe -name "" -age 20
2.GIF 动画
package main
import (
"fmt"
"image"
"image/color"
"image/gif"
"io"
"math"
"math/rand"
"os"
"time"
)
var palette = []color.Color{color.White, color.Black}
const (
whiteIndex = 0 // first color in palette
blackIndex = 1 // next color in palette
)
func main() {
// The sequence of images is deterministic unless we seed
// the pseudo-random number generator using the current time.
// Thanks to Randall McPherson for pointing out the omission.
rand.Seed(time.Now().UTC().UnixNano())
// Create the file
file, err := os.Create("img.gif")
if err != nil {
panic(err)
}
defer func(file *os.File) {
err := file.Close()
if err != nil {
fmt.Println(err)
}
}(file)
lissajous(file)
}
func lissajous(out io.Writer) {
const (
cycles = 5 // 振荡器完整的 x 转数
res = 0.001 // 角分辨率
size = 100 // 图像画布封面 [-size...+size] (-尺寸...+尺寸
nframes = 64 // 动画帧数
delay = 8 // 帧与帧之间的延迟,以 10ms 为单位
)
freq := rand.Float64() * 3.0 // y 振荡器的相对频率
anim := gif.GIF{LoopCount: nframes}
phase := 0.0 // phase difference
for i := 0; i < nframes; i++ {
rect := image.Rect(0, 0, 2*size+1, 2*size+1)
img := image.NewPaletted(rect, palette)
for t := 0.0; t < cycles*2*math.Pi; t += res {
x := math.Sin(t)
y := math.Sin(t*freq + phase)
img.SetColorIndex(size+int(x*size+0.5), size+int(y*size+0.5), blackIndex)
}
phase += 0.1
anim.Delay = append(anim.Delay, delay)
anim.Image = append(anim.Image, img)
}
err := gif.EncodeAll(out, &anim)
if err != nil {
return
}
}
3.获取url
// Fetch prints the content found at a URL.
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
for _, url := range os.Args[1:] {
if !strings.HasPrefix(url, "http://") {
url = "http://" + url
}
resp, err := http.Get(url)
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: %v\n", err)
os.Exit(resp.StatusCode)
}
_, err = io.Copy(os.Stdout, resp.Body)
resp.Body.Close()
if err != nil {
fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err)
os.Exit(1)
}
}
}
./fetch.exe http://bloggo.chat/
就可以获得这个页面的html文件了(bloggo.chat是我使用Golang写得博客系统,欢迎大家观看)
使用并发编程获取url的操作:
// Fetchall fetches URLs in parallel and reports their times and sizes.
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) // start a goroutine
}
for range os.Args[1:] {
fmt.Println(<-ch) // receive from channel 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) // send to channel ch
return
}
// Discard 如名字一样,是一个用于丢弃数据的地方
// 虽然有时候我们不在意数据内容,但可能存在数据不读出来就无法关闭连接的情况,这时候就可以使用 io.Copy(ioutil.Discard, io.Reader) 将数据写入 Discard
// Discard 是 io.Writer 类型,是通过 devNull 定义得来的,devNull 实现了 Write 方法(其实什么都没做,直接返回长度,永远成功)
nbytes, err := io.Copy(ioutil.Discard, resp.Body)
resp.Body.Close() // don't leak resources
if err != nil {
ch <- fmt.Sprintf("while reading %s: %v", url, err)
return
}
secs := time.Since(start).Seconds()
ch <- fmt.Sprintf("%.2fs %7d %s", secs, nbytes, url)
}