Go语言基础知识总结(超详细整理)

news2025/6/8 3:35:55

1. Go语言简介

Go语言(又称Golang)是Google于2009年发布的开源编程语言,具备简洁、高效、并发等特点,适合服务器开发、云计算、大数据等场景。


2. 环境安装与配置

  • 下载地址:https://golang.org/dl/
  • 安装后配置环境变量 GOPATHGOROOT
  • 使用命令验证:
go version
go env

3. 基本语法

Go语言代码文件以 .go 结尾,程序入口为 main 包下的 main() 函数。

package main

import "fmt"

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

4. 数据类型

Go的基本数据类型分为:

类型类别类型示例说明
整型int, int8, int16, int32, int64有符号整数
无符号整型uint, uint8, uint16, uint32, uint64无符号整数
浮点型float32, float64浮点数
字符串string字符串
布尔型booltruefalse

5. 变量与常量

变量定义示例:

var a int = 10
b := 20       // 简短声明(只能在函数内)
const Pi = 3.14

6. 运算符

运算符类型示例说明
算术运算符+, -, *, /, %加减乘除余数
关系运算符==, !=, <, >, <=, >=比较大小、相等
逻辑运算符&&, `, !`逻辑与、或、非
赋值运算符=, +=, -=, *=赋值及复合赋值

7. 流程控制

7.1 条件语句

if age >= 18 {
    fmt.Println("成年人")
} else {
    fmt.Println("未成年人")
}

7.2 switch语句

switch day {
case 1:
    fmt.Println("星期一")
case 2:
    fmt.Println("星期二")
default:
    fmt.Println("其他")
}

7.3 循环

Go只有一种循环:for,可用多种形式。

for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// 类似while
i := 0
for i < 5 {
    fmt.Println(i)
    i++
}

// 无限循环
for {
    // ...
}

8. 函数

函数定义及调用示例:

func add(a int, b int) int {
    return a + b
}

func main() {
    sum := add(3, 4)
    fmt.Println(sum) // 7
}

多返回值:

func swap(a, b string) (string, string) {
    return b, a
}

9. 数组与切片

9.1 数组

固定长度的同类型元素集合。

var arr [3]int = [3]int{1, 2, 3}
fmt.Println(arr[0]) // 1

9.2 切片

动态大小的数组。

slice := []int{1, 2, 3}
slice = append(slice, 4)
fmt.Println(slice) // [1 2 3 4]

10. 字典(map)

键值对集合。

m := make(map[string]int)
m["age"] = 30
fmt.Println(m["age"]) // 30

11. 结构体与接口

11.1 结构体

自定义类型,包含多个字段。

type Person struct {
    Name string
    Age  int
}

p := Person{Name: "Tom", Age: 25}
fmt.Println(p.Name) // Tom

11.2 接口

定义一组方法的集合,实现多态。

type Speaker interface {
    Speak() string
}

type Dog struct{}

func (d Dog) Speak() string {
    return "汪汪"
}

func main() {
    var s Speaker = Dog{}
    fmt.Println(s.Speak()) // 汪汪
}

12. 面向对象编程基础

  • Go不支持传统继承,但支持组合和接口实现多态。
  • 结构体可以绑定方法。
func (p Person) Greet() {
    fmt.Println("Hello, my name is", p.Name)
}

13. 并发基础

Go的最大特点是内置协程goroutine和通信机制channel

go func() {
    fmt.Println("并发执行")
}()

ch := make(chan string)
go func() {
    ch <- "消息"
}()
msg := <-ch
fmt.Println(msg)

14. 包与模块管理

  • 代码通过包组织,默认main为程序入口。
  • 使用go mod管理依赖。
go mod init example.com/mymodule
go get github.com/gin-gonic/gin

15. 错误处理

Go无异常机制,使用多返回值返回错误。

func divide(a, b int) (int, error) {
    if b == 0 {
        return 0, fmt.Errorf("除数不能为0")
    }
    return a / b, nil
}

res, err := divide(10, 0)
if err != nil {
    fmt.Println("错误:", err)
}

16. 标准库常用功能

  • fmt:格式化输入输出
  • os:操作系统接口
  • net/http:HTTP客户端/服务器
  • time:时间处理
  • encoding/json:JSON编解码

17. 练习题


17.1 选择题(共10题,每题1分)

  1. Go语言的程序入口是哪个函数?
    A. start()
    B. main()
    C. init()
    D. run()

  2. 以下哪个关键字用于定义常量?
    A. var
    B. let
    C. const
    D. static

  3. Go语言中下列哪个数据类型是无符号整数?
    A. int32
    B. uint
    C. float64
    D. byte

  4. 下列哪个循环语句在Go语言中不存在?
    A. for
    B. while
    C. 无限循环 for {}
    D. for-range

  5. 下列哪个函数声明是正确的?
    A. func add(a int, b int) int {}
    B. function add(a int, b int) int {}
    C. func add(a int, b int): int {}
    D. def add(a int, b int) int {}

  6. 下列哪个语句用于创建map?
    A. m := []int{}
    B. m := make(map[string]int)
    C. m := map{}
    D. m := map()

  7. Go中声明变量a的正确写法是?
    A. var a int = 10
    B. a := 10
    C. var a = 10
    D. 以上都对

  8. Go语言的并发单位是?
    A. Thread
    B. Process
    C. Goroutine
    D. Coroutine

  9. 在Go语言中,错误通常用什么类型返回?
    A. string
    B. error
    C. exception
    D. bool

  10. 下面关于Go接口的说法,哪个是正确的?
    A. 接口必须显示实现
    B. 结构体自动实现接口中所有方法即实现接口
    C. 接口不能作为类型使用
    D. 接口中只能定义字段


17.2 判断题(共5题,每题1分)

  1. Go语言支持继承机制。 ( )
  2. Go语言中的数组长度是固定的。 ( )
  3. defer语句用于延迟函数的执行直到当前函数结束。 ( )
  4. Go的slice是动态数组。 ( )
  5. panicrecover用于错误处理机制。 ( )

17.3 填空题(共5题,每题2分)

  1. 用关键字___定义常量。
  2. 用关键字___定义变量。
  3. 切片的底层数据结构是___
  4. 结构体中绑定的方法第一个参数通常是___
  5. 使用___关键字启动一个新的goroutine。

17.4 简答题(共5题,每题4分)

  1. 简述Go语言的变量声明方式。
  2. 什么是切片?它和数组有什么区别?
  3. Go语言如何实现并发?请简述goroutine和channel的作用。
  4. 如何在Go语言中处理错误?
  5. 介绍Go语言中接口的作用和特点。

17.5 编程题(共5题,每题6分)

  1. 编写函数,实现两个整数的交换(交换两个变量的值)。
func swap(a, b int) (int, int) {
    return b, a
}
  1. 编写函数,计算传入整数数组中所有元素的和。
func sum(arr []int) int {
    total := 0
    for _, v := range arr {
        total += v
    }
    return total
}
  1. 编写函数,判断一个整数是否为素数。
func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}
  1. 定义结构体Person,包含姓名和年龄,并写一个方法打印个人信息。
type Person struct {
    Name string
    Age  int
}

func (p Person) PrintInfo() {
    fmt.Printf("姓名: %s, 年龄: %d\n", p.Name, p.Age)
}
  1. 写一个函数,使用goroutine打印数字1到5,主函数等待所有goroutine完成。
import (
    "fmt"
    "sync"
)

func printNum(i int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println(i)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go printNum(i, &wg)
    }
    wg.Wait()
}

练习题参考答案及简要解析

选择题

  1. B — Go程序入口函数是main()
  2. C — 常量用const声明
  3. B — uint是无符号整型
  4. B — Go没有while语句,用for实现类似功能
  5. A — Go函数用func定义,参数和返回类型明确
  6. B — make函数创建map
  7. D — 上述写法都合法
  8. C — Goroutine是Go语言轻量级并发单位
  9. B — 错误类型为error
  10. B — 结构体隐式实现接口

判断题

  1. × — Go不支持继承
  2. √ — 数组长度固定
  3. √ — defer延迟执行函数直到当前函数退出
  4. √ — slice是动态数组
  5. √ — panic和recover配合处理异常

填空题

  1. const
  2. var
  3. 数组
  4. 结构体变量(如p)
  5. go

简答题

  1. 变量声明可以用var声明,指定类型;函数内可以用:=简短声明。
  2. 切片是基于数组的动态大小序列,长度可变。
  3. Go通过goroutine实现轻量级线程,并用channel通信同步。
  4. 错误通过多返回值返回,调用方判断error是否为nil处理。
  5. 接口定义行为规范,结构体实现接口方法即实现接口,实现多态。

编程题

26-30题代码详见题目内容,均为标准答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2403679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buuctf——web刷题第二页

[网鼎杯 2018]Fakebook和[SWPU2019]Web1没有&#xff0c;共30题 目录 [BSidesCF 2020]Had a bad day [网鼎杯 2020 朱雀组]phpweb [BJDCTF2020]The mystery of ip [BUUCTF 2018]Online Tool [GXYCTF2019]禁止套娃 [GWCTF 2019]我有一个数据库 [CISCN2019 华北赛区 Day2…

MVC与MVP设计模式对比详解

MVC&#xff08;Model-View-Controller&#xff09;和MVP&#xff08;Model-View-Presenter&#xff09;是两种广泛使用的分层架构模式&#xff0c;核心目标是解耦业务逻辑、数据和界面&#xff0c;提升代码可维护性和可测试性。以下是它们的对比详解&#xff1a; MVC 模式&…

二叉树的遍历总结

144.二叉树的前序遍历(opens new window)145.二叉树的后序遍历(opens new window)94.二叉树的中序遍历 二叉数的先中后序统一遍历法 public static void preOrder(BiTree root){BiTree p root;LinkedList<BiTree> stack new LinkedList<>();while(p ! null ||…

win32相关(远程线程和远程线程注入)

远程线程和远程线程注入 CreateRemoteThread函数 作用&#xff1a;创建在另一个进程的虚拟地址空间中运行的线程 HANDLE CreateRemoteThread([in] HANDLE hProcess, // 需要在哪个进程中创建线程[in] LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全…

[Spring]-AOP

AOP场景 AOP: Aspect Oriented Programming (面向切面编程) OOP: Object Oriented Programming (面向对象编程) 场景设计 设计: 编写一个计算器接口和实现类&#xff0c;提供加减乘除四则运算 需求: 在加减乘除运算的时候需要记录操作日志(运算前参数、运算后结果)实现方案:…

agent 开发

什么是 agent&#xff1f; Agent智能体&#xff08;又称AI Agent&#xff09;是一种具备自主感知、决策与行动能力的智能系统&#xff0c;其核心在于模仿人类的认知过程来处理复杂任务。以下是其关键特性和发展现状的综合分析&#xff1a; 一、核心定义与特征 #‌## 自主决策…

Golang——5、函数详解、time包及日期函数

函数详解、time包及日期函数 1、函数1.1、函数定义1.2、函数参数1.3、函数返回值1.4、函数类型与变量1.5、函数作参数和返回值1.6、匿名函数、函数递归和闭包1.7、defer语句1.8、panic和recover 2、time包以及日期函数2.1、time.Now()获取当前时间2.2、Format方法格式化输出日期…

深度学习环境配置指南:基于Anaconda与PyCharm的全流程操作

一、环境搭建前的准备 1. 查看基础环境位置 conda env list 操作说明&#xff1a;通过该命令确认Anaconda默认环境&#xff08;base&#xff09;所在磁盘路径&#xff08;如D盘&#xff09;&#xff0c;后续操作需跳转至该磁盘根目录。 二、创建与激活独立虚拟环境 1. 创…

打卡day46

知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力后的特征图和热力图 内…

在SpringBoot中使用AWS SDK实现邮箱验证码服务

1.依赖导入&#xff08;maven&#xff09; <dependency><groupId>software.amazon.awssdk</groupId><artifactId>ses</artifactId><version>2.31.46</version></dependency> 2.申请两个key 发件人邮箱需要验证&#xff1a; …

深入理解二叉搜索树:原理到实践

1.二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树 若它的左树不为空&#xff0c;则左子树上所有节点的值都小于或等于根节点的值。若它的右树不为空&#xff0c;则右子树上所有节点的值都大于或等于根节点的…

测试W5500的第11步_使用ARP解析IP地址对应的MAC地址

本文介绍了基于W5500芯片的ARP协议实现方法&#xff0c;详细阐述了ARP请求与回复的工作机制。ARP协议通过广播请求和单播回复实现IP地址与MAC地址的映射&#xff0c;确保局域网设备间的可靠通信。文章提供了完整的STM32F10x开发环境下的代码实现&#xff0c;包括网络初始化、SP…

终极数据结构详解:从理论到实践

终极数据结构详解&#xff1a;从理论到实践 我将从 底层原理、时间复杂度、空间优化、实际应用 和 代码实现 五个维度&#xff0c;彻底解析数据结构。内容涵盖&#xff1a; 线性结构&#xff08;数组、链表、栈、队列&#xff09;非线性结构&#xff08;树、图&#xff09;高…

【k8s】k8s集群搭建

k8s集群搭建 一、环境准备1.1 集群类型1.2 安装方式1.3 主机规划1.4 环境配置1.4.1 说明1.4.2 初始化1.4.3 关闭防火墙和禁止防火墙开机启动1.4.4 设置主机名1.4.5 主机名解析1.4.6 时间同步1.4.7 关闭selinux1.4.8 关闭swap分区1.4.9 将桥接的IPv4流量传递到iptables的链1.4.1…

60天python训练计划----day45

DAY 45 Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 之前的内容中&#xff0c;我们在神经网络训练中&#xff0c;为了帮助自己理解&#xff0c;借用了很多的组件&#x…

C# Wkhtmltopdf HTML转PDF碰到的问题

最近碰到一个Html转PDF的需求&#xff0c;看了一下基本上都是需要依赖Wkhtmltopdf&#xff0c;需要在Windows或者linux安装这个可以后使用。找了一下选择了HtmlToPDFCore&#xff0c;这个库是对Wkhtmltopdf.NetCore简单二次封装&#xff0c;这个库的好处就是通过NuGet安装HtmlT…

Vue3 (数组push数据报错) 解决Cannot read property ‘push‘ of null报错问题

解决Cannot read property ‘push‘ of null报错问题 错误写法 定义变量 <script setup>const workList ref([{name:,value:}])</script>正确定义变量 <script setup>const workList ref([]) </script>解决咯~

html文字红色粗体,闪烁渐变动画效果,中英文切换版本

1. 代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>红色粗体闪烁文字表格 - 中英文切换</t…

基于Django开发的运动商城系统项目

运动商城系统项目描述 运动商城系统是一个基于现代Web技术构建的电子商务平台&#xff0c;专注于运动类商品的在线销售与管理。该系统采用前后端分离架构&#xff0c;前端使用Vue.js实现动态交互界面&#xff0c;后端基于Django框架提供RESTful API支持&#xff0c;数据库采用…

Python60日基础学习打卡Day45

之前的神经网络训练中&#xff0c;为了帮助理解借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&#xff0c;运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了&#xff0c;他就是…