变量
var a int // 如果没有赋值,默认为0
var a int = 1 // 声明时赋值
var a = 1 // 声明时赋值
a := 1
msg := "Hello World!"
if
age := 18
if age < 18 {
fmt.Printf("Kid")
} else {
fmt.Printf("Adult")
}
// 可以简写为:
if age := 18; age < 18 {
fmt.Printf("Kid")
} else {
fmt.Printf("Adult")
}
for
sum := 0
for i := 0; i < 10; i++ {
if sum > 50 {
break
}
sum += i
}
range遍历
nums := []int{10, 20, 30, 40}
for i, num := range nums {
fmt.Println(i, num)
}
// 0 10
// 1 20
// 2 30
// 3 40
m2 := map[string]string{
"Sam": "Male",
"Alice": "Female",
}
for key, value := range m2 {
fmt.Println(key, value)
}
处理url
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)
}
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)
}
}
一个简单的web
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe("localhost:8080", nil))
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}
go语言http包HandleFunc与Handle的使用
package main
import (
"fmt"
"log"
"net/http"
)
func testRouter(w http.ResponseWriter, r *http.Request) {
fmt.Println(r.Header)
fmt.Println("URL:", r.URL)
fmt.Println("正在访问接口...")
}
type MyHttpServer struct {
content string
}
//实现Handler接口
func (s MyHttpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) {
fmt.Println("正在访问...", s.content, "Header:", req.Header)
w.Write([]byte("write..."))
}
func main() {
//设置访问路由
http.HandleFunc("/test", testRouter)
var s = MyHttpServer{content: "content"}
//设置访问路由
http.Handle("/t", s)
//创建监听端口
err := http.ListenAndServe("127.0.0.1:9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
flag包
package main
import (
"flag"
"fmt"
"strings"
)
var n = flag.Bool("n", false, "i dont know")
var sep = flag.String("s", " ", "ssss")
func main() {
flag.Parse()
fmt.Print(strings.Join(flag.Args(), *sep))
if !*n {
fmt.Println("hey")
fmt.Println()
}
}
数组
package main
import (
"fmt"
)
func main() {
var a [3]int
fmt.Println(a)
fmt.Printf("%T", a)
type Currency int
const (
USD Currency = iota
EUR
GBP
RMB
)
symbol := [...]string{USD: "$", EUR: "#", GBP: ")", RMB: "yuan"}
fmt.Println(RMB, symbol[RMB])
r := [...]int{99: -1}
fmt.Println(r)
}
slice
关于slice
区别数组和slice
package main
import "fmt"
func main() {
//数组
words := [4]int{1, 2, 3, 4}
fmt.Println(words)
//slice
var s []int
s = append(s, 1)
fmt.Println(s)
}
interface 接口
package main
import "fmt"
type USB interface {
read()
write()
}
type Computer struct {
}
type Mobile struct {
}
func (c Computer) read() {
fmt.Println("computer is read......")
}
func (c Computer) write() {
fmt.Println("computer is write......")
}
func (c Mobile) read() {
fmt.Println("mobile is read......")
}
func (c Mobile) write() {
fmt.Println("mobile is write......")
}
func main() {
c := Computer{}
m := Mobile{}
c.read()
c.write()
m.read()
m.write()
}
//https://zhuanlan.zhihu.com/p/441952415
sync.WaitGroup并发
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func download(url string) {
fmt.Println("start to download", url)
time.Sleep(time.Second) // 模拟耗时操作
wg.Done()
}
func main() {
for i := 0; i < 3; i++ {
wg.Add(1)
go download("a.com/" + string(i+'0'))
}
wg.Wait()
fmt.Println("Done!")
}
channel并发
package main
import (
"fmt"
"time"
)
var ch = make(chan string, 10) // 创建大小为 10 的缓冲信道
func download(url string) {
fmt.Println("start to download", url)
time.Sleep(time.Second)
ch <- url // 将 url 发送给信道
}
func main() {
start := time.Now()
for i := 0; i < 3; i++ {
go download("a.com/" + string(i+'0'))
}
for i := 0; i < 3; i++ {
msg := <-ch // 等待信道返回消息。
fmt.Println("finish", msg)
}
endTime := time.Since(start)
fmt.Println("Done!", endTime)
}