• Go语言学习之1 基本概念、环境搭建、第一个Go程序


    一、环境搭建

    见我的这篇博客 https://www.cnblogs.com/xuejiale/p/10258244.html

    二、golang语言特性
    1. 垃圾回收
        1) 内存自动回收,再也不需要开发人员管理内存
        2) 开发人员专注业务实现,降低了心智负担
        3) 只需要new分配内存,不需要释放
    2. 天然并发
        1) 从语言层面支持并发,非常简单
        2) goroute,轻量级线程,创建成千上万个goroute成为可能
    例如:

    我们创建F:goprojectsrcgo_devday1goroute目录,并在该目录下创建文件goroute.go及main.go
    goroute.go:

    package main
    
    import(
        "fmt"
    )
    
    func test_goroute(a int) {
        fmt.Println(a)
    }

    main.go:

    package main
    
    import(
        "time"
    )
    
    func main() {
        //goroute 并发,使用go关键字
        for i := 0; i < 100; i++ {
            go test_goroute(i)
        }
        //这块sleep 2s是为了等待上面"线程"执行完
        time.Sleep(2*time.Second) //sleep 2s
    }

    解释:

      goroute,轻量级线程通过关键字go来执行(go test_goroute(i))

    运行:

           到F:goprojectsrcgo_devday1goroute目录下运行go run main.go goroute.go  可以发现100个数据打出是乱序

    注意:运行的命令 go run main.go goroute.go  (go run main.go会报错

        3) 基于CSP(Communicating Sequential Process)模型实现 (goroute + channel算是CSP模型)
    3. channel
        1) 管道,类似unix/linux中的pipe

    func main() {
        pipe := make(chan int,3)
        pipe <- 1
        pipe <- 2
    }

        2) 多个goroute之间通过channel进行通信

    在F:Goprojectsrcgo_devday1goroute_example目录下创建goroute和main目录
    goroute目录下创建add.go:
    add.go

    package goroute
    
    func Add(a int, b int, c chan int) {
        sum := a + b
        c <- sum
    }

    在main目录下创建main.go:

    main.go

    package main
    
    import (
        "go_dev/day1/goroute_example/goroute"
        "fmt"
    )
    
    func main() {
        var pipe chan int
        pipe = make(chan int, 1)
        go goroute.Add(100, 200, pipe)
        sum := <- pipe
        fmt.Println("sum = ", sum)
    }

    解释:

    var pipe chan int
    pipe = make(chan int, 1) 分别为定义一个管道,里面可以存一个整数

    运行:

        方法1. 进入到F:Goproject目录下,执行下面的命令

        go run src/go_dev/day1/goroute_example/main/main.go

        方法2. 先编译成二进制文件,然后执行(需创建F:goprojectin目录,存放编译后的二进制文件)

        go build -o bin/goroute_test.exe go_dev/day1/goroute_example/main 注意该命令与方法1 命令的区别

    注意:Windows下可执行文件需以.exe结尾。

        3) 支持任何类型

    4. 多返回值
        一个函数返回多个值

    func calc(a int, b int)(int,int) {
        sum := a + b
        avg := (a+b)/2
        return sum, avg
    }

    调用:

    sum, avg := calc(10, 20)
    //如果只需要第一个返回值:
    sum, _ := calc(10, 20)

    5. 包的概念

        1)  和python一样,把相同功能的代码放到一个目录,称之为包;
        2)  包可以被其他包引用;
        3)  main包是用来生成可执行文件,每个程序只有一个main包;
        4)  包的主要用途是提高代码的可复用性。

    例如:

    创建F:Goprojectsrcgo_devday1package_example目录,在该目录下分别创建calc和main目录,在calc目录下创建add.go和sub.go,在main目录下创建main.go
    add.go (注意add.go和sub.go中的方法名首字母必须大写,否则无法被外部调用)

    package calc
    
    func Add(a int, b int) int {
        return a + b
    }

    sub.go

    package calc 
    
    func Sub(a int, b int) int {
        return a - b
    }

    main.go

    package main 
    
    import (
        "fmt"
        "go_dev/day1/package_example/calc"
    )
    
    func main() {
        sum := calc.Add(100, 200)    
        sub := calc.Sub(100, 200)
        fmt.Println("add = ", sum)
        fmt.Println("sub = ", sub)
    }

    运行:

    方法1. 执行go run src/go_dev/day1/package_example/main/main.go

     

    方法2. 生成可执行文件

  • 相关阅读:
    命令行程序如何获取HINSTANCE?
    解决C++项目使用sqlite中文乱码问题
    第三章 CLR如何解析引用类型
    第二章 生成、打包、部署和管理应用程序及类型
    第一章 CLR执行模型
    如何快速提升自己硬实力
    前端优化
    Eureka的工作原理以及它与ZooKeeper的区别
    单链表反转
    链表中head->next = p;和p=head->next;之间的区别
  • 原文地址:https://www.cnblogs.com/xuejiale/p/10333392.html
Copyright © 2020-2023  润新知