【Go】1、Go语言基础

前言

        本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。


Go语言的特点

          Go语言由Google团队设计,以简洁、高效、并发友好为核心目标。

          具有以下优点:

  1. 语法简单、学习曲线平缓:语法关键字很少,且容易记忆。

  2. 丰富的标准库:大多数情况下不需要外部引入第三方库,直接使用内置标准库即可。

  3. 完善的工具链:包管理、代码格式化、测试、性能分析、文档生成、依赖管理等等,应有尽有。

  4. 静态链接:部署简单,跨平台性强,安全稳定。

  5. 高性能、高并发:接近c的性能,低内存开销。

        下文将介绍Go语言的基本语法,个人感觉更是Go语言现代化(甚至有点超现代化)的体现。


数据类型

        Go语言常用的数据类型:

类型分类

类型名称

关键字/定义

默认值(零值)

特点

布尔型

bool

bool

false

只能为 truefalse

整数型

有符号整数

int, int8, int16, int32, int64

0

根据平台不同,int 可能为 32 或 64 位

无符号整数

uint, uint8, uint16, uint32, uint64

0

无负数范围

浮点型

float32, float64

float32, float64

0.0

float64 精度更高

字符/字节型

byte(别名)

byte

0

uint8 的别名

rune(别名)

rune

0

int32 的别名

字符串型

string

string

""

不可变,UTF-8 编码

错误类型

error

error

nil

内置接口类型,表示错误状态


一、变量定义

        Go语言的变量定义方式有很多种:

1. var name type :用于显式定义变量。

var a, b int = 1, 2

2. name := val :用于隐式定义变量。

f := float32(e)

3. const name type = val : 用于常量定义

const s string = "constant"

二、选择结构

        选择结构分为 if ,switch-case。

1. if

if a == 1 {fmt.Println("真的")
}else {fmt.Println("假的")
}

2. switch-case

a := 2
switch a {
case 1:fmt.Println(1)
case 2:fmt.Println(2)
default:fmt.Println("default")
}

    三、循环结构

            Go语言形式上只有for循环一种循环方式,但是可以改为类似于while的形式循环。

    for i := 1; i < 9; i++ {fmt.Print(i)
    }
    k := 1
    for k < 10 {k++fmt.Println(k)
    }

    四、数组

            Go语言的数组和C很类似,定长数组。

    for i := 1; i < 9; i++ {fmt.Print(i)
    }
    k := 1
    for k < 10 {k++fmt.Println(k)
    }

    五、切片

            Go语言的切片类似于C++的vector、Java中的List,是一种变长数组。

            并且支持类似Python中元组的操作语法。

    s := make([]string, 3)
    s[0] = "a"
    s[1] = "b"
    s[2] = "c"
    fmt.Println(s[2])
    fmt.Println(len(s))
    s = append(s, "d")
    s = append(s, "e", "f")
    fmt.Println(s)
    c := make([]string, len(s))
    copy(c, s)
    fmt.Println(c)
    fmt.Println(s[2:5])
    fmt.Println(s[:4])
    fmt.Println(s[2:])
    good := []string{"g", "h", "o"}    
    fmt.Println(good)

    六、Map

            和各种语言的Map类似,用于存储键值对。

    mp := make(map[string]int)
    mp["one"] = 1
    mp["two"] = 2
    r, ok := mp["unknow"]
    fmt.Println(r, ok)

    七、range

            Go语言中的range类似于C++的auto,用于快速遍历。

    nums := []int{2, 3, 4}
    sum := 0
    for i, num := range nums {sum += numif num == 2 {fmt.Println("idx:", i, "num:", num)}
    }
    fmt.Println(sum)
    m := map[string]string{"a": "A", "b": "B"}
    for k, v := range m {fmt.Println(k, v)
    }
    for k := range m {fmt.Println(k)
    }

    八、函数

            Go语言的函数,个人认为是Go语言在语法上现代化的标志之一,支持多返回,非常方便。

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

    九、指针

            Go语言的指针类似C的指针,个人非常喜欢指针,一直觉得Java把指针完全去除了也是一个问题。

            在语法上,*作为解引用、&作为引用。

    func add2(a *int) {*a += 2
    }

    十、结构体

            Go语言提供结构体用于类型封装,特殊的是,结构体方法在Go语言中需要写在外面。

    type user struct {name     stringpassword string
    }
    func (this user) checkPassword(password string) bool {return this.password == password
    }

    十一、错误处理

            Go语言为函数提供了一种新奇的try-catch方法。Go语言中,我们在某种方面来讲是在面向异常编程。我们需要通过 error 类型将函数中的错误返回,然后手动处理。

            Go语言提供了一个特殊变量 nil 用于判断是否捕捉到了异常。

    func checkError(password string) (bool, error) {return password == "123", errors.New("not Found")
    }
    v, err := checkError("456")
    if err != nil {fmt.Println(v, err)
    } else {fmt.Print(v)
    }

    十二、特殊函数

    1. json处理

    type userInfo struct {Name stringAge  int `json:"age"`
    }
    func solve14() {a := userInfo{Name: "wang", Age: 18}buf, err := json.Marshal(a)if err != nil {panic(err)}fmt.Println(buf)fmt.Println(string(buf))var b userInfoerr = json.Unmarshal(buf, &b)if err != nil {panic(err)}fmt.Println(b)
    }

    2. 时间处理

    fmt.Println(time.Now())
    fmt.Println(time.Now().Unix())
    fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
    fmt.Println(time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC))

    3. 字符串转数字

    fmt.Println(strconv.ParseInt("111", 10, 64))
    fmt.Println(strconv.ParseFloat("111.11", 64)
    fmt.Println(strconv.ParseInt("0x1000", 0, 64
    fmt.Println(strconv.Atoi("111"))

    4. 获取线程信息

    fmt.Println(os.Args)
    fmt.Println(os.Getenv("PATH"))

            下篇将对学习的语法结合视频进行综合实践。

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

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

    相关文章

    AI时代的新营销范式:生成式引擎优化(GEO)的崛起——品牌如何被大模型收录

    在数字化浪潮席卷全球的今天&#xff0c;我们正站在一个前所未有的历史拐点。如果说过去二十年&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;重塑了企业与消费者的连接方式&#xff0c;那么未来二十年&#xff0c;生成式引擎优化&#xff08;GEO&#xff09;将彻底颠覆…

    实用蓝牙耳机哪款好?先做好使用场景分析!

    市面上的蓝牙耳机款式繁多&#xff0c;618到来之际&#xff0c;消费者如何选择适合自己的蓝牙耳机&#xff1f;实用蓝牙耳机哪款好&#xff1f;关键在于做好使用场景分析&#xff01;今天&#xff0c;就带大家结合不同的使用场景&#xff0c;分享三款倍思音频的精品蓝牙耳机。 …

    PTA刷题笔记3(微难,有详解)

    7-15 计算圆周率 代码如下&#xff1a; #include <stdio.h>int main() {double threshold;scanf("%lf", &threshold);double pi_over_2 1.0; // π/2的初始值&#xff08;第一项1&#xff09;double term 1.0; // 当前项的值int n 1; …

    基于SpringBoot+Vue的社区医院信息平台设计与实现

    项目背景与概述 随着医疗健康信息化的发展&#xff0c;社区医院的管理逐渐由传统的手工模式转向信息化管理。为了提高医院的管理效率、减少人工操作、提升服务质量&#xff0c;开发一个高效且实用的社区医院信息平台显得尤为重要。本系统基于Spring Boot框架与MySQL数据库设计…

    旧物回收小程序:让闲置焕发光彩,为生活增添价值

    你是否常常为家中堆积如山的闲置物品而烦恼&#xff1f;那些曾经心爱的物品&#xff0c;如今却成了占据空间的“鸡肋”&#xff0c;丢弃可惜&#xff0c;留着又无处安放。别担心&#xff0c;一款旧物二手回收小程序将为你解决这一难题&#xff0c;让闲置物品重新焕发光彩&#…

    掩码与网关是什么?

    1. 子网掩码&#xff08;Subnet Mask&#xff09; 作用&#xff1a;划分“小区”范围 想象你住在一个小区&#xff08;子网&#xff09;里&#xff1a; 小区门牌号 IP地址&#xff08;如 192.168.1.10&#xff09; 小区边界 子网掩码&#xff08;如 255.255.255.0&#xf…

    【Bluedroid】蓝牙HID Host disconnect流程源码解析

    本文基于 Android 蓝牙 HID&#xff08;Human Interface Device&#xff09;Host 模块的源码&#xff0c;深入解析 HID 设备断开连接的完整流程。重点覆盖从应用层触发断开请求&#xff0c;到 BTIF 层&#xff08;接口适配层&#xff09;状态校验与异步传递、BTA 层&#xff08…

    python定时删除指定索引

    脚本 import logging from datetime import datetime, timedelta from elasticsearch import Elasticsearch# 配置日志记录 logging.basicConfig(filenamedelete_uat_indices.log,levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s )# Elasticsearch 集群的…

    GESP编程等级认证C++三级7-字符、字符数组与字符串2

    2.3 用字符串定义字符数组的好处 使用字符串定义字符数组需要额外考虑其末尾的“\0”&#xff0c;为什么还要使用这种看上去“麻烦”的方法呢&#xff1f;从图5所示的代码就能看出原因。 图5 用字符串定义字符数组好处的代码 从图5中可以看出&#xff0c;a4是用字符串进行初始…

    EasyRTC音视频实时通话WebP2P技术赋能的全场景实时通信解决方案

    一、技术背景 在数字化浪潮席卷全球的当下&#xff0c;实时通信技术凭借其即时性、高效性的优势&#xff0c;已然成为推动各行业创新发展的核心动能。EasyRTC深度融合WebP2P技术&#xff0c;构建起去中心化的通信架构&#xff0c;实现了低延迟、高可靠的数据传输&#xff0c;为…

    Claude MCP协议从入门到精通

    目录 一、什么是MCP协议? 二、Function Calling 和 MCP 协议的区别? 三、MCP相关网站 3.1 官方文档 3.2 综合型 MCP 资源聚合平台 3.3 垂直领域 MCP Server 工具 3.4 开发者工具与社区 3.5 企业级服务与数据库集成 3.6 新手友好型平台 四、MCP 架构 4.1. MCP Hosts…

    YOLOv11改进 | Conv/卷积篇 | 2024 ECCV最新大感受野的小波卷积WTConv助力YOLOv11有效涨点

    YOLOv11改进 | Conv/卷积篇 | 2024 ECCV最新大感受野的小波卷积WTConv助力YOLOv11有效涨点 引言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;的核心操作——卷积运算正经历着革命性的变革。2024年ECCV会议提出的**小波卷积&#xff08;WTConv, Wav…

    英伟达CEO黄仁勋COMPUTEX 2025演讲实录:AI工厂时代已来,Blackwell架构全面投产

    5月19日&#xff0c;英伟达创始人兼首席执行官黄仁勋在台北国际电脑展&#xff08;COMPUTEX 2025&#xff09;发表主题演讲&#xff0c;系统阐述了英伟达从芯片设计向AI基础设施服务商的战略转型&#xff0c;并披露了包括Blackwell架构升级、新一代AI计算平台及机器人技术在内的…

    RabbitMQ的核心原理及应用

    在分布式系统架构中&#xff0c;消息中间件是实现服务解耦、流量缓冲的关键组件。RabbitMQ 作为基于 AMQP 协议的开源消息代理&#xff0c;凭借高可靠性、灵活路由和跨平台特性&#xff0c;被广泛应用于企业级开发和微服务架构中。本文将系统梳理 RabbitMQ 的核心知识&#xff…

    服务攻防矩阵

    4.1 中间件漏洞利用 WebLogic反序列化漏洞&#xff08;CVE-2023-21839&#xff09; 漏洞原理&#xff1a; T3协议反序列化未严格校验&#xff0c;攻击者可注入恶意序列化对象执行任意代码。 攻击流程&#xff1a; 使用ysoserial生成CommonsCollections6 payload&#xff1…

    PictureThis 解锁高级会员版_v5.3.0 拍植物知名称和植物百科

    PictureThis 解锁高级会员版_v5.3.0 拍植物知名称和植物百科 PictureThis是一款创新的植物识别与园艺指导应用程序&#xff0c;旨在帮助用户快速识别植物种类、了解植物信息&#xff0c;并提供专业的园艺养护建议…

    大模型 Agent 就是文字艺术吗?

    最近在技术圈里有一个很有趣的争论&#xff1a;大模型 Agent 是不是就是各种 Prompt 的堆叠&#xff1f;像 Manus 这样看起来很智能的 Agent&#xff0c;本质上是不是就是用巧妙的 Prompt 约束大模型生成更好的输出&#xff1f;换句话说&#xff0c;这是不是一门文字艺术&#…

    LeetCode 1340. 跳跃游戏 V(困难)

    题目描述 给你一个整数数组 arr 和一个整数 d 。每一步你可以从下标 i 跳到&#xff1a; i x &#xff0c;其中 i x < arr.length 且 0 < x < d 。i - x &#xff0c;其中 i - x > 0 且 0 < x < d 。 除此以外&#xff0c;你从下标 i 跳到下标 j 需要满…

    三相电压的优势,应用场景,功率测量

    三相系统概述 我国三相系统&#xff0c;由频率相同&#xff0c;幅度类似的三个交流电压组成&#xff0c;每个电压相差120度。 三相系统的优势 启动电机&#xff1a;三个矢量间隔的电压&#xff0c;在电机中产生旋转磁场&#xff0c;不需要额外绕组就可以启动电机。 减少线损…

    [原创](计算机数学)(The Probability Lifesaver)(P14): 推导计算 In(1-u) 约等于 -u

    [作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…