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

一、环境搭建

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

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

我们创建F:\go\project\src\go_dev\day1\goroute目录,并在该目录下创建文件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:\go\project\src\go_dev\day1\goroute目录下运行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:\Go\project\src\go_dev\day1\goroute_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:\Go\project目录下,执行下面的命令

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

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

    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:\Go\project\src\go_dev\day1\package_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. 生成可执行文件

 

posted @ 2019-01-30 01:22  pointerC++  阅读(524)  评论(0编辑  收藏  举报