Golang简介

目录

第一章 go语言起源

第一节 go语言发展

1.知名编程语言或系统的发展简吏

2.Go语言的前世今生

3.go语言的核心特性

4.Go语言的优势和其他语言的对比

5.Go开发环境搭建

第二章 go语言Helloworld

一、go项目工程结构

二、执行go程序

三、go程序的解释说明

第三章 go的执行原理以及go命令

一、go的源码文件

二、Go的命令

1、go run

2、go build

3、go install

4、go get

5、其他命令

第四章 安装Goland开发工具

1.使用goland

2.安装和配置 Visual Studio Code for Go 开发(安装和配置 Visual Studio Code for Go 开发 - Go on Azure | Microsoft Learn)

1.安装 Go

2.安装 Visual Studio Code

3.安装 Go 扩展

4.更新 Go 工具

5.编写示例 Go 程序

6.运行调试器

解决 vscode下载go相关插件失败的问题

附1:go 引用其它文件中的函数

附2:GO 命令教程 (go get · GO 命令教程 · 看云)

附3: 100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具 (100天精通Golang(基础入门篇)——第3天:Go语言的执行原理及常用命令、编码规范和常用工具-腾讯云开发者社区-腾讯云)


第一章 go语言起源

第一节 go语言发展
1.知名编程语言或系统的发展简吏

B语言

B语言之父: Ken Thompson(肯.汤普森).

B语言是贝尔实验室开发的一种通用的程序设计语言,该语言得名于汤姆森的妻子Bonnie。

C语言

C语言之父: Dennis Ritchie(丹尼斯.里奇)

美国著名计算机专家、C语言发明人、UNIX之父。在1969-1973年期间发明了C语言和Unix操作系统。

Unix

Unix之父: Dennis Ritchie(丹尼斯.里奇)及 Ken Thompson(肯.汤普森)。在1973年左右发明了Unix操作系统。两人因此获得1983年图灵奖。

C++

C++之父:Bjarne Stroustrup(本贾尼.斯特劳斯特卢普)

1982年,美国贝尔实验室的Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,它被命名为C++。

Python

Python之父: Guido van Rossum(吉多. 范 . 罗苏姆)

1989年,为了打发圣诞节假期,Guido开始写Python语言的编译/解释器。1994年发布1.0版本,1995年9月发布了Python3.5版。

Java

java: James Gosling(詹姆斯.高斯林)

1991年开发Oak, 1994年更名为Java, 1995年5月正式发布。

JavaScript

javascript: Brendan Eich(布兰登. 艾奇)

艾奇对java一点兴趣也没有,为了应会公司安排的任务,他于1995年5月只用了10天时间就把javascript设计出来了。

2.Go语言的前世今生

Go的产生背景

为什么需要一个新的语言

最近十年来, C/C++在计算领域没有很好得到发展,并没有新的系统编程语言出现。对开发程度和系统效率在很多情况下不能兼得。要么执行效率高,但低效的开发和编译,如c++; 要么执行低效,但拥有有效的编译,如.NET、Java;所以需要一种拥有较高效的执行速度、编译速度和开发速度的编程语言,Go就横空出世。

3.go语言的核心特性

并发编程

Go语言在并发编程方面比绝大多数语言要简洁不少,这一点是其最大亮点之一,也是其在未来进入高并发高性能场景的重要筹码。

golang的并发执行单元是一种称为goroutine的协程。

内存回收(GC)

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

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

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

内存分配

先分配一块大内存区域

大内存被切分成各个大小等级的块,放入不同的空闲list中

对象分配空间时从空闲list中取出大小合适的内存块

内存回收时,会把不用的内存重放回空闲list

空闲内存会按照一定策略合并,以减少碎片。

编译

目前Golang具有两种编译器

一种是建立在GCC基础上的Gccgo

另外一种是分别针对64位x64和32位x86计算机的一套编译器(6g和8g)

网络编程

socket用net.Dial(基于tcp/udp, 封装了传统的connect、listen、accept等接口)

http用http.Get/Post()

rpc用client.Call(‘class_name.method_name’, args, &reply)

函数多返回值

允许函数返回多个值,在某些场景下,可以有效的简化编程

GO语言推荐的编程风格,是函数返回的最后一个参数为error类型(只要逻辑体中可能出现异常),这样,在语言级别支持多返回值,就很有必要了。

语言交互性

语言交互性指的是本语言是否能和其他语言交互,比如可以调用其他语言编译的库。

Go可以和C程序交互

异常处理

3个重要关键字defer、panic、recover

defer是函数结束后执行,呈先进后出;

panic是程序出现无法修复的错误时使用,但会让defer执行完;

recover会修复错误,不至于程序终止,当不确定函数不会出错时使用derfer+recover

其他一些有趣的特性

类型推导

接口interface

defer机制

“包”的概念

交叉编译

4.Go语言的优势和其他语言的对比

1、Go语言设计初衷(zhong)

为了解决当时Google开发遇到的问题

编译慢

大量的C++代码, 同时又引入了java和Python

更新的花费起来越长

分布式的编译系统

数百万的服务器

2、Go语言的特色

高效的并发编程

内存回收(GC)

编译速度快

函数多返回值

语言交互性

没有异常处理(error is value)

5.Go开发环境搭建

https://golang.org (需要翻墙)

Golang的国内网站: The Go Programming Language

下载安装包

解压到指定目录下:

tar -xzf go1.20.3.linux-amd64.tar.gz -C /usr/local

运行 vim /etc/profile.在最下面加入下面两行

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

让环境变量生效 ,

source /etc/profile

运行 :

go version

centos 8.2 配置 go 项目开发环境_爱死亡机器人的技术博客_51CTO博客

Go语言GOPATH详解(Go语言工作目录)

windows下gopath设置 - 爱码网

第二章 go语言Helloworld

一、go项目工程结构

配置好工作目录后, 就可以编码开发了,在这之前,先看下go的通用项目结构,这里的结构主要是源代码相应地资源文件存放目录结构.

1.1 gopath目录

gopath目录就是我们存储所编写源代码的目录。该目录下往往要有3个子目录:src, bin, pkg

src ----里面每一个子目录,就是一个包,包内是Go的源码文件

pkg ---编译后生成的。包的目标文件

bin ---生成的可执行文件

1.2 编写第一个程序

在Home/go的目录 下,(就是GoPath目录里),创建一个目录叫src, 然后再该目录下创建一个文件玩意儿叫hello,在该目录下创建一个文件叫helloworld.go,并双击打开,输入以下内容。

package main
import "fmt"
func main(){
  fmt.Println("hello, world")
}
二、执行go程序

执行go程序有以下几种方式:

方式一:使用go run命令

进入终端: windows下使用快捷键win+R,输入cmd打开命令提示符.

linux下可以使用快捷键 ctrl + alt + T

mac下command+空格,输入 termainl

进入helloworld.go所在的目录

输入go run helloworld.go命令并观察运行结果

方式二:使用go build命令

打开终端; 在任意文件路径上,运行 go install hello

也可以进入项目(应用包)的路径,然后运行: go install

注意:在编译生成go程序时,go实际上会去两个地方找程序包:GOROOT下的src文件夹下,以及GOPATH 下的src文件夹下。

在程序包里,自动找main包的main函数作为程序入口,然后进行编译。

运行go程序

在/home/go/bin下(即GOPATH目录下)(如果之前没有bin目录则会自动创建),会发现出现了一个hello的可执行文件,用如下命令运行: ./hello

错误:go.mod file not found in current directory or any parent directory;

开启Go Module Windows:

go env -w GO111MODULE=auto

Mac:

export GO111MODULE=on

然后命令行输入 go env 查看环境变量,GO111MODULE 选项为 on 代表修改成功。

初始化 在你的项目文件夹下,使用GO MODULE进行初始化,下面是我刚刚报错的工程:

执行 go mod init day01 (day01为项目名),在项目根目录会出现一个 go.mod 文件。

注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只是初始化了,所以我执行go run hello.go 跑不起来。根据提示,go get xxx(相关依赖)下载至本地即可。

go module介绍

GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。

GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。

GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:

1.当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。

2.当前文件在包含go.mod文件的目录下面。

注:

在使用go modules时,GOPATH是无意义的,不过它还是会把下载的依赖存储在$GOPATH/pkg/mod 中

也会把go install 的结果放在 $GOPATH/bin 中。

当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg

允许同一个package多个版本并存,且多个项目可以共享缓存的module。

三、go程序的解释说明

1.package

在同一个包下面的文件属于同一个工程文件,不用import包,可以直接使用

在同一个包下面的所有文件的package名,都是一样的

在同一个包下面的文件package名都建议设为该目录名,但也可以不是

2.import

import "fmt"告诉Go编译器这个程序需要使用fmt包的函数, fmt包实现了格式化IO(输入/输出)的函数可以是相对路径也可以是绝对路径,推荐使用绝对路径(起始于工程根目录)

1)、点操作

我们有时候会看到如下的方式导入包

import(
    ."fmt"
)

这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是间面你调用的fmt.Println("hello world") 可以省略的写成Println("hello world")

2)、别名操作

别名操作顾名思义我们可以把包命名成另一个我们用起来容易记忆的名字。

import(
  f "fmt"
)

别名操作的话调用包函数时前缀变成了我们的前缀,即f.Println("hello world");

3)、_操作

这个操作经常是让很多人费解的一个操作符,请看下面这个import

import (
    "database/sql"
    _ "github.com/ziutek/mymysql/godrv"
)

_操作基实是引入该包,而不直接使用包里面的函数,而是调用了该包里的init函数。

3.main

main()是程序运行的入口。

四、包的说明

源代码都是存放在GOPATH的src目录下,多个项目的时候,怎么区分呢,答案是通过包,使用包来组织项目结构。如java开发一样,包以网站域名开头就不会有重复,包名是唯一的。

如果有自己的域名,那也可以使用自己的域名,如果没有个人域名,现在流行的做法是使用个人的github名,因为每个人的是唯一的,当然也会有重复。

src目录下跟着一个个域名命名的文件夹,再以github.com文件夹为例,它里面有是以github用户名命名的文件玩意儿,用于存储属于这个github用户编写的go源代码。

第三章 go的执行原理以及go命令

一、go的源码文件

1、命令源码文件:(命令源码文件是 Go 程序的入口)

声明自己属于 main 代码包、包含无参数声明和结果声明的 main 函数。

命令源码文件被安装以后,GOPATH 如果只有一个工作区,那么相应的可执行文件会被存放当前工作区的 bin 文件夹下;如果有多个工作区,就会安装到 GOBIN 指向的目录下。

命令源码文件是Go程序的入口.

命令源码文件应该是被单独放在一个代码包中,是可以单独运行的。可以使用 go run 命令直接运行,也可以通过 go build 或 go install 命令得到相应的可执行文件。但是多个命令源码文件虽然可以分开单独 go run 运行起来,但是无法通过 go build 和 go install。所以命令源码文件是可以在机器的任何目录下运行的。

2、库源码文件

库源码文件就是不具备命令源码文件上述两个特征的源码文件。存在于某个代码包中的普通的源码文件。

库源码文件被安装后,相应的归档文件(.a 文件)会被存放到当前工作区的 pkg 的平台相关目录下。

3、测试源码文件

名称以 _test.go 为后缀的代码文件,并且必须包含 Test 或者 Benchmark 名称前缀的函数:

func TestXXX( t *testing.T) {

} 名称以 Test 为名称前缀的函数,只能接受 *testing.T 的参数,这种测试函数是功能测试函数。

func BenchmarkXXX( b *testing.B) {

}

名称以 Benchmark 为名称前缀的函数,只能接受 *testing.B 的参数,这种测试函数是性能测试函数。

举个栗子:

比如平时我们在 LeetCode 上刷算法题,这时候写的就是一个程序,这就是命令源码文件,可以在电脑的任意一个文件夹新建一个 go 文件就可以开始刷题了,写完就可以运行,对比执行结果,答案对了就可以提交代码。

但是公司项目里面的代码就不能这样了,只能存放在 GOPATH 目录下。因为公司项目不可能只有命令源码文件的,肯定是包含库源码文件,甚至包含测试源码文件的。

二、Go的命令

目前Go的最新版本1.20里面基本命令有以下18个。

可以打开终端输入: go help可查看到Go的这些命令以及简介。

Usage:
​
        go <command> [arguments]
​
The commands are:
​
        bug         start a bug report
        build       compile packages and dependencies
        clean       remove object files and cached files
        doc         show documentation for package or symbol
        env         print Go environment information
        fix         update packages to use new APIs
        fmt         gofmt (reformat) package sources
        generate    generate Go files by processing source
        get         download and install packages and dependencies
        install     compile and install packages and dependencies
        list        list packages or modules
        mod         module maintenance
        work        workspace maintenance
        run         compile and run Go program
        test        test packages
        tool        run specified go tool
        version     print Go version
        vet         report likely mistakes in packages
​
Use "go help <command>" for more information about a command.
​
Additional help topics:
​
        buildconstraint build constraints
        buildmode       build modes
        c               calling between Go and C
        cache           build and test caching
        environment     environment variables
        filetype        file types
        go.mod          the go.mod file
        gopath          GOPATH environment variable
        gopath-get      legacy GOPATH go get
        goproxy         module proxy protocol
        importpath      import path syntax
        modules         modules, module versions, and more
        module-get      module-aware go get
        module-auth     module authentication using go.sum
        packages        package lists and patterns
        private         configuration for downloading non-public code
        testflag        testing flags
        testfunc        testing functions
        vcs             controlling version control with GOVCS
​
Use "go help <topic>" for more information about that topic.

其中和编译相关的有build、get、install、run这4个,接下来依次查看这四个命令的作用。

在详细介绍这四个命令之前,先罗列一下通用的命令标记,以下这些命令都可适用的。

名称 说明
-a 用于强制重新编译所有涉及的Go语言代码包(包括Go语言标准库中的代码包),即使它们已经是最新的 了,该标记可以让我们有机会通过改动底层的代码包做一些实验。
-n 使命令仅打印其执行过程中用到的所有命令,而不去真正执行它们,如果不只想查看或者验证命令的执行过程,而不想改变任何东西,使用它正好合适。
-race 用于检测并报告指定Go语言程序中存在的数据竞争问题,当用Go语言编写并发程序的时候,这是很重要的检测手段之一。
-v 用于打印命令执行过程中涉及的代码包。这一定包括我们指定的目标代码包,并且有时还会包括该代码包直接或间接依赖的那些代码包。这会让你知道哪些代码包被执行过了。
-work 用于打印命令执行时生成和使用的临时工作目录 的名字,且命令执行完成后不删除它,这个目录下的文件可能会对你有用,也可以从侧面了解命令的执行过程,如果不添加此标记,那么临时工作目录会在命令执行完毕前删除。
-x 使命令打印其执行过程中用到的所有命令,并同时执行它们。
1、go run

专门用来运行命令源码文件的命令,注意,这个命令不是用来运行所有Go的源码文件的!

go run命令只能接受一个命令源码文件以及若干个库源码文件(必须同属于main包)作为文件参数,且不能接受测试源码文件,它在执行时会检查源码文件的类型,如果参数中有多个或者没有命令源码文件,那么go run命令就只会打印错误提示信息并退出,而不会继续执行。

这个命令具体干了些什么事情呢?来分析分析,我们先重新创建一个新文件: mytest.go, 并加入以下代码:

package main
import "
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值