GO语言基础

本文介绍了GO语言的基本概念,强调了其在高性能服务端应用中的适用性,以及其简洁语法和高效编译。文章详细讲解了如何配置GoLandIDE,设置GOROOT和GOPATH,并概述了变量声明、数组、切片和map等基础语法概念。切片的动态扩容和map的使用特性也得到了阐述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. GO语言简介

GO语言是一种开源的编程语言,由Google公司开发。它诞生的初衷是为了解决大规模网络系统的性能和程序的简洁性问题。

Go语言特别适合用来开发高性能的服务端应用程序,因为它支持并发编程,并且具有非常高效的垃圾回收机制。

Go语言具有非常简洁和易读的语法。它没有继承和接口,而是通过结构体和方法来支持面向对象编程。

Go语言还有一个很重要的特性是支持快速编译。它使用静态链接,可以极快地构建和部署应用程序。在测试中GO语言的编译速度仅稍稍落后于C语言和C++,运行速度比任何语言都要快。

2. GO语言开发入门

开发环境配置

建议使用VSCode和GoLand这两款IDE进行Golang的开发。
由于GoLand的配置比VSCode更加简便,且功能更加丰富,因此更加推荐使用GoLand。

打开GoLand后进入设置界面,找到GOROOT选项。如果没有下载Go语言的SDK,则点击右边加号直接下载想要下载的版本。这里我下载的是Go 1.19.5版本,建议下载最新的稳定版本。
图片.png

在GOPATH选项中配置全局GOPATH。
GOPATH 是 Go 语言的工作环境变量,它用于指定 Go 程序的源码文件和第三方库的存放路径。

当编译和运行 Go 程序时,编译器和运行时会查找 GOPATH 环境变量指定的目录中的源码文件和第三方库。

每个 Go 程序都有一个工作目录,工作目录中存放着 Go 程序源代码文件。在 GOPATH 环境变量中指定的目录中可以有多个工作目录,每个工作目录都是一个 Go 程序的工程目录。

如果没有设置 GOPATH 环境变量,编译器和运行时会默认使用当前目录作为工作目录。

通过设置 GOPATH 环境变量,可以将 Go 程序的源码文件和第三方库存放在不同的目录中,这样可以更好地管理 Go 程序的源码文件和第三方库。

GOPATH默认位置在C盘,因此建议将路径设置为非系统盘的其他磁盘。

图片.png

基础语法

声明变量

在Go中声明变量有三种方式,以声明一个整形变量 a 为例

  • var a int = 1

    此时定义了一个 int 类型的变量 a

  • var a = 1

    此时Go会根据赋予的值确定变量 a 的类型

  • a := 1

    此时Go会根据赋予的值确定变量 a 的类型,写法更加简便

需要注意的是,使用第2种写法和第3种写法的效果并非完全一样,a := 1 不能够定义全局变量,即不能够写在方法体之外,而 var a = 1 可以。

特殊数据类型

数组(静态数组)
// 声明array1是一个数组,同时给array1分配三个空间,默认值为0
var array1 [3]int

// 声明array1是一个数组,同时给array1分配三个空间,默认值为[1,2,3]
var array1 [3]int{1,2,3}

此时如果要在函数中传入数组代码如下

func ArrayFunc(array1 [3]int) {
    ...
}

需要注意的是此时形参为值传递,即在函数中改变 array1 的值不会对原先的数组产生改变

slice 切片(动态数组)

slice 可以使用如下代码进行定义

// 声明slice1是一个切片,并且初始化,长度是3,默认值是1,2,3
slice1 := []int{1, 2, 3}

// 声明slice1是一个切片,但是不分配空间
// 使用make开辟三个空间
var slice1 []int
slice1 = make([]int, 3)

// 声明slice1是一个切片,同时给slice1分配三个空间,默认值为0
var slice1 []int = make([]int, 3)

// 通过:=推到出slice1是一个切片,同时给slice1分配三个空间,默认值为0
slice1 := make([]int, 3)

其中 slice1 := make([]int, 3) 最为常用,且使用 make 函数初始化slice时可以传入动态的 len 参数,这是使用 var slice1 [3]int 定义时不能实现的。

slice 可以使用如下代码进行追加元素

// 声明slice1是一个切片,同时给slice1分配三个空间,默认值为0
// 声明的slice1的len = 3, cap = 5
slice1 := make([]int, 3, 5) // 此时slice1中的元素为 [0, 0, 0]
// 使用append函数进行追加元素
slice1 = append(slice1, 2) // 此时slice1中的元素为 [0, 0, 0, 2]

slice 有自动扩容机制,slice 有 lencap 两个基本属性,其中 len 是用户合法操纵的切片长度,cap 是底层开辟的数组的总长度。
当切片追加元素时的长度大于 cap 的大小时,切片自动扩容为现在 cap 的两倍。

slice 可以使用如下代码进行截取

s := []int{1, 2, 3} // len = 3, cap = 3, s = [1,2,3]
// 遵循左闭右开截取原则
s1 := s[0:2] // s1 = [1,2]

需要注意的是,此时 s1 的指针指向切片 s 的位置。
即如果改变 s1 的元素,则 s 对应的位置的元素也会发生改变。
如果要拷贝一个副本,则需要使用 copy() 函数进行深层拷贝,代码如下

s := []int{1, 2, 3}
s1 := make([]int, 3)
// 将s中的值拷贝到s1中
copy(s1, s)

此时如果要在函数中传入数组代码如下

func ArrayFunc(slice1 []int) {
    ...
}

需要注意的是此时形参为引用传递,即在函数中改变 slice1 的值会对原先的数组产生改变

map 表

map 可以使用如下代码进行定义,类似于对 slice 的定义

// 定义一个map,key为int类型,value为string类型
var map1 map[int]string

// 定义一个map,key为int类型,value为string类型
map1 := make(map[int]string)

// 定义一个map,并设置初始值
m2 := map[string]int{"one": 1, "two": 2}

值得注意的是,使用两种方法初始化的map的 len = 0,但是使用 var map1 map[int]string 定义的map1为nil,即此时 map1 == nil 为 TRUE,且无法直接添加元素,需要 map1 = make(map[int]string, 10) 进行初始化;

而使用 map1 := make(map[int]string) 定义的 map1不为nil,即此时 map1 == nil 为 FALSE,且可以直接添加元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值