Go Programming Language

Page content

[TOC]

Go语言深入学习。

Go Language Getting Started

开发环境搭建

1、安装Go

a.打开网址 https://golang.org/dl/

b.根据操作系统选择对应的安装包

c.安装

d.设置环境变量 linux


export GOROOT=$PATH:/path/to/go/

export PATH=$PATH:$GOROOT/bin/ 

export GOPATH=/home/user/project/go 

e.设置环境变量(window不用设置)

vsCode安装go插件失败,到github上下载插件后自行安装。

https://github.com/golang/tools

安装调试后,被360禁止权限。找了半天不知道如何恢复,看来我要卸载360了。(把360关了之后,可以正常调试程序了)

package main

import (
	"fmt"
)

func add(a int, b int) int {
	var sum int
	sum = a + b
	return sum
}

func main() {
	fmt.Println("hello")
	fmt.Println("你好!")
	fmt.Println(add(15, 20))
	var c int
	c = add(100, 300)
}

编译不会通过,因为go追求简洁,没有用到的变量c,不会编译通过。

调试工具

delve

https://github.com/derekparker/delve/tree/master/Documentation/installation

golang语言特性

1、垃圾回收

a.内存自动回收,再也不需要开发人员管理内存

b.开发人员专注业务实现,降低了心智负担

c.只需要new分配内存,不需要释放。

2、天然并发

goroutine 轻量级线程,创建千万个goroutine可能。

基于CSP (Communicating Sequential Process)模型成为可能

通信序列进程。每个goroutine都是独立的单位。简单的理解是轻量级的线程。上万个goroutine是可能的。比操作系统的线程轻量。

感觉一下并发^_^

	for i := 0; i < 100; i++ {
		go print(i) // go routine
	}
	time.Sleep(time.Second)

// API server listening at: 127.0.0.1:19386
// 4
// 0
// 600
// 2
// 1
// 9
// 5
// 6
// 7
// 8
// 3
// 12
// 10
// 11
// 14
// 13
// 15
// 16
// 79
// 59
// 60	

启动100个并发的goroutine

3、channel 管道

a. 管道,类似unix/linux中的pipe

b. 多个goroutine之间通过channel通信

c. 支持任何类型

pipe := make(chan int, 3)
pipe <- 100
pipe <- 87

4、多返回值

a.一个函数返回多个值

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

包的概念

a.和Python的包概念差不多

b.共外部使用的包中的函数名定义要 大写

c.包可以被其他包引用

d.main包是用来生成可执行文件,每个程序只有一个main包

e.包的主要用途是提高代码的可复用性

例如:

main.go

package main

import (
	"fmt"
	"go_dev/day1/goroutine_example/goroutine"
)

func main() {
	c := make(chan int, 1)
	go goroutine.Add(10, 20, c)
	num := <-c
	fmt.Println(num)
}
package goroutine

func Add(a int, b int, c chan int) { // c为管道
	c <- (a + b)
}