美文网首页
go - 学习笔记

go - 学习笔记

作者: 自走炮 | 来源:发表于2020-10-07 18:10 被阅读0次
  • 基础
  • 函数 指针 结构体 接口
  • 错误
  • 协程
  • 通道

基础

$ go version
$ go run main.go
$ go build main.go # 编译二进制执行文件
package main
import (
    "fmt"
    "time"
)

func main() {
    fmt.Println("hello world.")
    // for 循环
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
    }
    // if 判断
    score := 30
    if score >= 30 {
        fmt.Println("30")
    } else if score >= 20 {
        fmt.Println("20")
    } else {
        fmt.Println("other")
    }
    // switch 判断
    switch time.Now().Weekday() {
    case time.Saturday, time.Sunday:
        fmt.Println("周末")
    default:
        fmt.Println("上班")
    }
    t := time.Now()
    switch {
    case t.Hour() < 12:
        fmt.Println("上午")
    default:
        fmt.Println("下午")
    }

    // 一维数组
    b := [5]int{1, 2, 3, 4, 5}
    // 二维数组
    var c [2][3]int
    for i := 0; i < 2; i++ {
        for j := 0; j < 3; j++ {
            c[i][j] = i + j
        }
    }
    // 创建空切片
    s := make([]string, 3)
    // 创建拷贝切片
    c := make([]string, len(s))
    copy(c, s)
    // map 哈希字典
    m := make(map[string]int)
    m["k1"] = 7
    m["k2"] = 13
    delete(m, "k2")
    // range 迭代
    nums := []int{2, 3, 4}
    sum := 0
    for _, num := range nums {
        sum += num
    }
    kvs := map[string]string{"a": "apple", "b": "banana", "c": "orange"}
    for k, v := range kvs {
        fmt.Printf("%s -> %s\n", k, v)
    }
    for i, c := range "iloveu" {
        fmt.Println(i, string(c))
    }
}

函数 指针 结构体 接口

package main
import (
    "fmt"
    "reflect"
)

// 返回多值
func calABCD(a, b int) (int, int, int, int) {
    return a+b, a-b, a*b, a/b
}
// 可变参数
func sum(nums ...int) int {
    fmt.Print(nums, " ")
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

// 接收指向 int 的指针
func byPointer(iptr *int) {
    *iptr = 0
}

// 定义矩形结构体
type rect struct {
    width, height int
}
// 为 rect 结构体定义计算面积方法 area(), 参数为指针类型
func (r *rect) area() float64 {
    return r.width * r.height
}
// 为 rect 结构体定义计算周长方法 perim(), 参数为值类型
func (r rect) perim() float64 {
    return 2 * (r.width + r.height)
}

// 定义几何图形接口
type geometry interface {
    area() float64
    perim() float64
}
// 计算函数,参数为几何图形接口类型
func measure(g geometry) {
    fmt.Println(reflect.TypeOf(g), g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

func main() {
    a, b, c, d := calABCD(200, 100)
    fmt.Println("ab四则计算=", a, b, c, d)
    result = sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    fmt.Println("1-10合计为=", result)

    i := 10
    byPointer(&i)
    fmt.Println("byptr:", i)
    fmt.Println("pointer:", &i)

    r := rect{width: 10, height: 4}
    fmt.Println("area: ", r.area())
    fmt.Println("perim:", r.perim())
    rp := &r
    fmt.Println("area: ", rp.area())
    fmt.Println("perim:", rp.perim())
    measure(r) // 用 measure 函数计算矩形面积和周长
}

错误

package main
import (
    "fmt"
    "errors"
)

// 错误结构体
type argError struct {
    arg int
    msg string
}
// 定义结构体的错误函数(实现错误接口)
func (e *argError) Error() string {
    return fmt.Sprintf("%d -> %s", e.arg, e.msg)
}

// 错误返回值的函数
func f1(num int) (int, error) {
    if num < 0 {
        return -1, errors.New("参数错误")
    }
    return 2 * num, nil
}
func f2(num int) (int, error) {
    if num < 0 {
        return -1, &argError{num, "参数不能为负值"}
    }
    return 2 * num, nil
}

func main() {
    // f1
    result, err := f1(10)
    fmt.Println(result, err)
    result, err = f1(-10)
    fmt.Println(result, err)
    // f2
    result, err = f2(10)
    fmt.Println(result, err)
    result, err = f2(-10)
    fmt.Println(result, err)
}

协程

package main
import (
    "os"
    "os/exec"
    "fmt"
    "time"
)

func sayHelo(name string) {
    for i := 1; i <= 5; i++ {
        fmt.Println("Helo", name, ":", i)
    }
}

func main() {
    cmd := exec.Command("clear")
    cmd.Stdout = os.Stdout
    cmd.Run()
    // 同步执行函数
    sayHelo("koma")
    // 异步执行函数
    go sayHelo("xiaoma")
    go sayHelo("iphone")
    go sayHelo("ipad")
    go sayHelo("swiftui")
    // 匿名函数,异步执行
    go func(msg string) {
        fmt.Println("this is a", msg)
    }("lesson")
    // 等待一秒
    time.Sleep(time.Second)
}

通道

package main
import (
    "fmt"
    "strconv"
)

func main() {
    // 定义字符型的通道
    message := make(chan string)
    go func() {
        for i := 1; i <= 3; i++ {
            message <- (strconv.Itoa(i) + ".helo channel.")
        }
    }()
    // 接收通道发送的消息
    result := ""
    result = <-message
    fmt.Println(result)
    result = <-message
    fmt.Println(result)
    result = <-message
    fmt.Println(result)

    // 循环接收通道内容
    message := make(chan string)
    go func() {
        for i := 1; i <= 5; i++ {
            if i == 5 {
                message <- ""
            } else {
                message <- (strconv.Itoa(i) + ".helo channel.")
            }
        }
    }()
    for result := range message {
        if result == "" {
            break
        } else {
            fmt.Println(result)
        }
    }

    // 建立有3个缓冲区的通道,即缓冲区消息达到3个时会阻塞当前线程
    message := make(chan string, 2) // 如果是2的话,系统会报错,因为线程阻塞死锁
    // 发送消息
    message <- "消息1"
    message <- "消息2"
    message <- "消息3"
    // 接收消息
    fmt.Println(<-message)
    fmt.Println(<-message)
    fmt.Println(<-message)
}

相关文章

网友评论

      本文标题:go - 学习笔记

      本文链接:https://www.haomeiwen.com/subject/hcdgrktx.html