2024年Go最全golang超详细基础入门教程_golang教程,2024年最新一线互联网公司面经总结

11 篇文章 0 订阅
10 篇文章 0 订阅

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

打开终端并输入以下命令来添加环境变量:

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

其中,**GOROOT是Go语言的安装路径,PATH**是环境变量中的一个路径,用于寻找Go命令。

2.3 验证安装

1. 安装一个编辑器,例如Visual Studio Code或Sublime Text等。

2. 使用编辑器创建一个Hello World程序,保存为hello.go

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}

3. 在终端中进入Hello World程序所在的目录,输入以下命令:

go run hello.go

如果一切正常,终端中应该输出“Hello, World!”

三、基础语法
3.1 变量定义和赋值

在Go语言中,可以使用关键字var来定义变量,并使用赋值运算符=对变量进行赋值。

例如,定义一个整数类型的变量并赋值为10的语句如下:

var age int = 10

在上面的语句中,var关键字用于声明一个变量,age是变量的名称,int是变量的类型,=是赋值运算符,将10赋给变量age

除了直接赋值,还可以使用类型推导来定义变量,例如:

var name = "Alice"

在上面的语句中,变量name的类型会被自动推导为字符串类型,并将字符串"Alice"赋值给变量name

还可以使用简短声明方式来定义和赋值变量,例如:

age := 20

在上面的语句中,:=是简短赋值运算符,表示将20赋值给新声明的变量age。由于没有明确指定变量的类型,因此编译器会根据右侧表达式的值来自动推导变量的类型。

需要注意的是,在Go语言中,变量名必须以字母或下划线开头,不能以数字开头。此外,变量名是区分大小写的。

3.2 类型别名

Go语言中的类型别名就是为已存在的类型定义一个别名,使用type关键字来定义,语法为type TypeAlias = Type

类型别名是Go 1.9版本添加的新功能,主要用于解决代码升级、迁移中存在的类型兼容性问题;在C/C++语言中,代码重构升级可以使用宏快速定义新的一段代码,Go语言中没有选择加入宏,而是解决了重构中最麻烦的类型名变更问题1。

例如,定义一个整数类型的别名Age

type Age int

那么Age就是int类型的别名。以后凡是使用Age的地方,都可以使用int代替。

3.3 常量

在Go语言中,常量是一种不可变的值。常量是在编译时就确定且在运行时不能被修改的量。

常量可以是任何基本类型,如整数、浮点数、布尔值、字符串或常量表达式。

定义常量的语法如下:

const constantName = value

其中,constantName是常量的名称,遵循标识符命名规则;value是常量的值。

例如,定义一个整数类型的常量Pi并赋值为3.14:

const Pi = 3.14

常量在编译时会被计算,因此可以在编译期间进行类型检查和类型推断

3.4 控制流语句

在Go语言中,控制流语句用于控制程序的执行流程。以下是一些常用的控制流语句:

3.4.1 条件语句(if)

根据条件执行不同的代码块:

if condition {
    // 如果条件为真,执行这里的代码块
} else if condition2 {
    // 如果条件为假,检查条件2,如果条件2为真,执行这里的代码块
} else {
    // 如果条件和条件2都为假,执行这里的代码块
}
3.4.2 switch语句

根据不同的条件执行不同的代码块:

switch expression {
case value1:
    // 当expression等于value1时执行的代码块
case value2:
    // 当expression等于value2时执行的代码块
...
default:
    // 当expression不等于任何一个case值时执行的代码块
}
3.4.3 循环语句(for)

重复执行同一段代码:

for initialization; condition; post {
    // 执行循环体
}
3.4.4 无限循环语句(for without conditions)

无限循环,除非使用break语句跳出循环:

for {
    // 无限循环,除非使用break语句跳出循环
}
3.4.5 跳转语句(break)

用于跳出循环或switch语句:

break; // 跳出当前循环或switch语句
3.4.6 返回语句(return)

从函数中返回值:

return value; // 返回一个值给调用者
3.4.7 错误处理(defer)

延迟执行某些代码,通常用于资源清理:

defer func() {
    // 延迟执行的代码,通常用于资源清理操作
}()

Go语言中还有一些更详细的控制流语句,包括空语句(empty statement)、无限循环语句(infinite loop)、标签和goto语句。由于篇幅有限,不再一一列举,有兴趣可自行学习。

3.5 函数定义和调用

在Go语言中,函数是一种可重复使用的代码块,用于执行特定的任务。函数定义指定了函数的名称、参数和返回值,而函数调用则是执行函数的过程。

下面是一个简单的函数定义和调用的示例:

package main

import "fmt"

// 函数定义
func greet(name string) string {
    return "Hello, " + name + "!"
}

func main() {
    // 函数调用
    fmt.Println(greet("Alice"))
    fmt.Println(greet("Bob"))
}

在上面的代码中,我们定义了一个名为greet的函数,它接受一个字符串参数name,并返回一个带有问候语的字符串。在main函数中,我们通过调用greet函数并传递不同的参数来打印不同的问候语。

在函数定义中,函数的名称指定了函数的名称,参数列表指定了函数接受的输入参数的类型和名称,而返回值列表指定了函数返回值的类型和名称。函数的定义以关键字func开头,后面跟着函数名称、参数列表和返回值列表。

在函数调用中,我们使用函数名称加上参数列表的方式来执行函数。参数列表中的参数数量和类型必须与函数定义中的参数列表匹配。调用函数后,返回的结果可以直接使用,也可以通过变量接收。

**请注意:**在Go语言中,函数的定义可以出现在任何地方,但通常建议将函数定义放在package级别以下。同时,函数名称的命名应该具有描述性,以便于阅读和理解。

3.6 数组和切片

在Go语言中,数组和切片是常用的数据结构,它们有一些共同点和区别。

数组的定义方式如下:

var arr [n]type

其中,n表示数组的长度,type表示数组元素的类型。例如,定义一个包含5个整数的数组:

var arr [5]int

可以通过索引访问数组元素,例如:

arr[0] = 10
fmt.Println(arr[0]) // 输出:10

切片的定义方式如下:

var slice []type

其中,type表示切片元素的类型。切片是一个动态长度的序列,可以通过追加元素来扩展。例如,创建一个包含3个整数的切片:

var slice []int
slice = append(slice, 10, 20, 30)

可以通过索引访问切片元素,例如:

slice[0] = 10
fmt.Println(slice[0]) // 输出:10

数组和切片的区别在于动态性和长度。数组的长度是固定的,不能改变,而切片的长度可以动态增长。此外,切片还有一些内置的方法和操作,例如len()append()函数,这些方法在数组中不可用。

需要注意的是,切片在创建时可以指定初始容量,例如:

var slice []int = make([]int, 5, 10)

这将创建一个初始长度为5,容量为10的切片。当切片的容量不足以容纳更多的元素时,切片会自动扩容。

3.7 映射

在Go语言中,映射(Map)是一种无序的键值对集合。它使用一个哈希表实现,提供了一种将键映射到值的方式。

映射的定义方式如下:

var m map[keyType]valueType

其中,keyType表示键的类型,valueType表示值的类型。

以下是一个使用映射的示例:

package main

import "fmt"

func main() {
    // 创建一个映射
    m := make(map[string]int)

    // 添加键值对
    m["apple"] = 1
    m["banana"] = 2
    m["orange"] = 3

    // 访问映射的值
    fmt.Println(m["apple"]) // 输出:1

    // 删除映射中的键值对
    delete(m, "banana")

    // 遍历映射
    for key, value := range m {
        fmt.Println(key, value)
    }
}

在上述示例中,我们首先使用make函数创建了一个映射m,然后通过key来添加、访问和删除映射中的值。使用delete函数可以删除指定键值对。最后,使用range循环遍历映射并打印键值对。

3.8 结构体

Go语言中的结构体(struct)是一种自定义数据类型,可以将多个基本数据类型组合到一起形成一个自定义的复合数据类型。

结构体的定义语法如下:

type 结构体名称 struct {
    字段1 字段1类型
    字段2 字段2类型
    ...
}

结构体中的字段名必须唯一,每个字段对应一个成员变量。结构体的定义和使用方法类似于C++中的结构体。

下面是一个简单的示例:

package main

import "fmt"

// 定义结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 声明结构体变量
    var p Person



![img](https://img-blog.csdnimg.cn/img_convert/283bad79076416d7a81248c52696e2ff.png)
![img](https://img-blog.csdnimg.cn/img_convert/beb4fae743482c4414bafa738b371951.png)
![img](https://img-blog.csdnimg.cn/img_convert/ba1613fb505c337e94b239649ad31223.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

 "fmt"

// 定义结构体
type Person struct {
    Name string
    Age  int
}

func main() {
    // 声明结构体变量
    var p Person



[外链图片转存中...(img-aREsXxgO-1715875817812)]
[外链图片转存中...(img-ftLYeXGA-1715875817813)]
[外链图片转存中...(img-IE8O2Ol4-1715875817813)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618658159)**

  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值