Go 介绍笔记

本文最后更新于:13 天前

Go 概述

Go 语言是一门需要编译才能运行的编程语言,也就是说代码在运行之前需要通过编译器生成二进制机器码,包含二进制机器码的文件才能在目标机器上运行,如果我们想要了解 Go 语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。

这一节会先对 Go 语言编译的过程进行概述,从顶层介绍编译器执行的几个步骤,随后的几节会分别剖析各个步骤完成的工作和实现原理,同时也会对一些需要预先掌握的知识进行介绍,确保后面的章节能够被更好的理解。

Go程序规范

go语言以包作为管理单位

每个文件必须声明包

程序必须有一个main包(重要)

Go工程规范

go入口,go有且只有一个入口函数main

一个文件里面只能有一个main函数

干活 执行函数

package main
import "fmt"
//入口函数
func main()
	//打印
	//"hello go"打印到屏幕,PrintLn()会自动换行
	//调用函数,大部分都需要导入包
	/*
	这也是注释,这是块注释
	*/
	fmt.PrintLn("hello go") //go语言语句结尾是没有分号的
	fmt.PirintLn("hello bds")
}
go build xxx.go  //通过编译xxx.go文件 然后生成一个以xx为名字的程序 直接执行xxx程序 输出程序结果
go run   xxx.go  //通过run 不生成程序 执行运行 一次性输出程序结果
###示例
➜  main go build hello.go
➜  main ./hello
hello.中国
➜  main ls
hello     hello.go  value1    value1.go
➜  main rm -fr hello
➜  main ll
total 3744
-rw-r--r--  1 budongshu  staff    74B 10 16 14:04 hello.go
-rwxr-xr-x  1 budongshu  staff   1.8M 10 16 16:47 value1
-rw-r--r--  1 budongshu  staff   124B 10 16 16:46 value1.go
➜  main go run hello.go
hello.中国
➜  main ls
hello.go  value1    value1.go

GOPROXY

export GOPROXY=https://goproxy.io 
or
$env:GOPROXY = "https://goproxy.io"

Go数据类型

计算机用来计算,计算前需要存数,如何存一个数呢

数据类型作用: 告诉编译器这个数(变量) 应该以多大的内存存储

命名

go 语言中函数名 变量名 常量名 类型名 语句标号和包名等所有的命名,都遵循一个简单的

命名规则: 一个名字必须以一个字母或者下划线开头,后面可以跟任意数量的字母,数字

或者下划线。大写字母和小写字母是不同的,heapSort Heapsort 是俩个不同的变量名字

import "fmt"  //导入包的时候必须要使用

func main() {

	//变量,程序运行期间,可以改变的量
	//声明格式: var 变量名 类型; 变量声明了,必须要使用
	//声明变量没有初始化的变量,默认值为0
	//同一个函数的{}里,声明的变量名是唯一的,不允许同名

	var a int
	fmt.Println("a = ",a)
	//可以同时声明多个变量
	//var b,c int

	a = 10     //变量的赋值
	fmt.Println("a = ",a)
	//变量的初始化: 声明变量时候,同时赋值
	var b int = 10 //初始化: 声明变量时,同时赋值(一步到位)
	b = 20         //赋值: 先声明,后赋值
	fmt.Println("b = ",b)

	// 自动推导类型,必须初始化,因为它是通过初始化的值来确定类型
	c := 30
	//%T 打印变量的所属类型
	fmt.Printf("c type is %T\n",c)
}

Go 基本单元

Go 语言本身只有 25 个关键字,涵盖了包管理、常量与变量、流程控制、函数调用、数据结构 和并发控制六个方面的语言特性。

函数

函数的声明

func return

func foo(argc int, argv []string) float64 {
	...
	return 0
}

内建的打印函数

func print(args ...T)
func println(args ...T)

延迟函数

defer
主函数

初始化函数

控制流

条件控制
if else break continue switch case default fallthrough

循环控制

for range

跳跃

goto

Go 基本类型

原始的数值类型包括


bool, 
uint, uint8, uint16, uint32, uint64, 
int, int8, int16, int32, int64, 
float32, float64

常量 const 与变量 var

const (
    name       = "val"
    PI float64 = 3.1415926
)
var (
    age = 18
)

变量除了使用 var 来进行声明外,还可以在函数内部通过 := 进行声明

数据容器与高级类型

  • 字符串
  • 切片和数组
  • 接口
  • 指针与零值

Go 并发与同步

  • Channel
  • Select
  • Go 块

Go 错误处理

type error interface {
	Error() string
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!