Go 入门

语言特点

  • Go语言引入包的概念,用于组织程序结构,Go语言的一个文件都要归属于一个包,而不能单独存在
  • 天然支持并发(所以非常支持云计算)
    • 语言层面支持并发,实现简单
    • gorotine,轻量级线程,可实现大并发处理,高效利用多核
    • 基于CPS并发模型(Communicating Sequential Processes)实现
  • 管道通信机制,形成Go语言特有的管道channel,通过管道实现Goroutine之间的通信
  • 支持多值返回
  • 切片slice,延时执行defer

环境配置

  • 在windows上下载好的go文件,go doc/go fmt/gogo.exe用来编译go代码
  • apt-get卸载
  • 对于linux,需要在~/.bashrc下设置路径,source ~/.bashrc命令更新配置,其中GOROOT就是go的源码包的位置,GOPATH是工作目录,是开发者Go的项目默认路径

Go语言分析

  • 天生支持并发,
  • 可以编译,可以解释
  • runtime系统调度,高效的GC
  • Go语言可以通过调Cgo包写C代码

Golang执行流程

  • 如果是对源码先编译,再执行,Go的执行流程
  • 如果是用go run直接执行Go源代码,解释执行
  • 编译执行与解释执行的区别:
    • 对于编译执行,生成的二进制文件,可以放到没有go开发环境,仍然可以执行
    • go run就是直接执行,没有生成二进制文件
    • 编译后的二进制文件,引入了很多run time,所以比源文件大很多

VScode go插件安装

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

之后重启VScode,看报错安装即可

go module

go env -w GO111MODULE=on开启Go Modules

随便创建一个目录,之后初始化Go Modules
go mod init github.com/yitong/35_goModule

切片

  • 切片就像数组的引用,切片并不存储任何数据,它只是描述了底层数组中的一段。更改切片的元素会修改其底层数组中对应的元素。与它共享底层数组的切片都会观测到这些修改。
  • [3]bool{true, true, false}会创建一个真实的数组
  • []bool{true, true, false}会创建一个真实的数组,并且创建一个引用了它的切片

函数闭包

  • Go的函数可以是一个闭包,闭包是一个函数,它引用了其函数体之外的变量。该函数可以访问并赋予其引用的变量的值,也就是说该函数被这些变量绑定在一起
package main

import "fmt"

func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

func main() {
	pos, neg := adder(), adder()
	for i := 0; i < 10; i++ {
		fmt.Println(
			pos(i),
			neg(-2*i),
		)
	}
}
// 每个adder()返回的函数都和sum绑定了
// 0 0
// 1 -2
// 3 -6
// 6 -12
// 10 -20
// 15 -30
// 21 -42
// 28 -56
// 36 -72
// 45 -90

方法

  • 可以为非结构体类型声明方法,但是不能是basic type,必须在一个包内为其取别名

等价二叉树

posted @ 2022-03-30 18:23  抿了抿嘴丶  阅读(47)  评论(0编辑  收藏  举报