Go语言基础语法
一、创建工程
说明:
(1)go.mod文件是go项目依赖管理文件,相当于前端的package.json,也就是Java项目中的Maven的pom.xml。
二、打印数据到控制台
(1)引入fmt
(2)使用fmt.Sprintf,参数为打印的变量(非必须)
(3)用Println()打印
例如:
package mainimport(
"fmt"
)func main(){
//%d表示整型数字,%s表示字符串
var stockcode=123
var enddate="2020-12-31"
var url="Code=%d&endDate=%s"
var target_url=fmt.Sprintf(url,stockcode,enddate)
fmt.Println(target_url)//输出结果为"Code=123&endDate=2020-12-31"
}
Go字符串格式化符号:
%v :按值的本来值输出
%+v:在%v的基础上,对结构体字段名和值进行展开
%#v:输出Go语言语法格式的值
%T:输出Go语言语法格式的类型和值
%%:输出%本体
%b:类型以二进制方式显示
%o:类型以八进制的方式显示
%d:类型以十进制的方式显示
%x:类型以十六进制的方式显示
%X:整数以十六进制、字母大写方式显示
%U:Unicode字符
%f:浮点数
%p:指针,十六进制方式显示
三、Go语言的变量
3.1 变量类型
3.1.1 基本类型
整型:int8、int16、int32、int64、uint8、uint16、uint32、uint64
浮点型:float32、float64
复数型:complex64、complex128
其他常用数字类型:byte(uint8)、int[32|64]、
字节类型:rune(int32),类似与其他语言里的char,可以表示任何Unicode字符,包括ASCII字符、中文字符、特殊符号等
字符串型:string(默认值为"")
布尔型:bool,值为true或false(默认值为false)
3.1.2 派生类型
指针:
var a=10;var b *int = & a;
数组和切片:
定义数组:
var arr [2]int = [2]int{2, 3, 4}
定义切片:var sli []int = []int{}(定义了一个变量sli,类型为切片slice的整型切片)
映射(字典):map
例如:
var a map[String]int//声明了一个变量a,类型为map,键类型为字符串,值类型为整型
结构体:
type User struct {Id intUsername stringAge byte}var user Useruser.Id = 20
3.2 变量声明
3.2.1 完整声明
Go语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
声明变量的一般形式是使用var关键字。
语法:
var <变量名> <类型>;
可以一次声明多个变量:
var <变量名1>,<变量名2> <类型>;
例如:
var a string = "ABC"
var b,c int = 1, 2
注意:如果没有初始化,则变量默认值为零。
3.2.2 根据值自动判定变量类型
var d = true
上述例子的var有些多余,可以用赋值操作符:来简写,称之为“初始化声明”:
b := true
注意:初始化声明只能被用在函数体内,而不可以用于全局变量的声明和赋值。
3.3 Go语言常量
使用关键字const替代var,常量的数据类型只能是基本类型,可以省略数据类型。
const b string="abc"
const b = "abc"
3.4 关键字go
go关键字用来启动一个新的goroutine。
package mainimport ("fmt""time"
)func hello() {fmt.Println("Hello world goroutine")
}func main() {go hello() // 启动新的 Goroutinefmt.Println("Hello main goroutine")time.Sleep(1 * time.Second) // 等待新的 Goroutine 执行完成
}
执行结果如下:
3.5 Go的通道chan
在 Go 语言中,chan 关键字用于创建通道(channel),通道是一种用于在 goroutine 之间进行通信的类型化管道。通过通道,你可以在不同的 goroutine 之间安全地传递数据。
(1)使用make函数来创建通道
通道的类型由其传递的数据类型决定。
(2)发送和接受数据
发送数据:通道 <- 值
接收数据:值 := <-通道
例如:
ch := make(chan int) // 在一个 goroutine 中发送数据
go func() { ch <- 42
}() // 在主 goroutine 中接收数据
value := <-ch
fmt.Println(value) // 输出: 42
(3)带缓冲的通道
默认情况下,通道是无缓冲的,这意味着发送操作会阻塞,直到另一方准备好接收数据。你可以通过提供一个缓冲区大小来创建一个带缓冲的通道。
例如:
ch := make(chan int, 2) // 创建一个带缓冲区的通道,可以存储 2 个整数
带缓冲的通道在缓冲区未满时不会阻塞发送操作,在缓冲区为空时不会阻塞接收操作。
(4)关闭通道
你可以使用 close 函数来关闭一个通道。关闭通道后,无法再向通道发送数据,但可以继续从通道接收数据,直到通道为空。
例如:
ch := make(chan int) go func() { ch <- 42 close(ch)
}() value, ok := <-ch
if ok { fmt.Println(value) // 输出: 42
} else { fmt.Println("通道已关闭")
}
3.6 range关键字
在 Go 语言中,range 关键字具有多重用途,主要用于遍历数组、切片(slice)、映射(map)、字符串以及通道(channel)。下面分别介绍这些用法:
遍历数组和切片
对于数组和切片,range 会返回两个值:索引和对应位置的元素值。
numbers := []int{1, 2, 3, 4, 5}
for index, value := range numbers { fmt.Println(index, value)
}
在上面的例子中,index 是元素的索引,而 value 是对应索引的元素值。
遍历映射
对于映射,range 会返回两个值:键和对应的值。
scores := map[string]int{"Alice": 90, "Bob": 85}
for key, value := range scores { fmt.Println(key, value)
}
在这个例子中,key 是映射的键,而 value 是与键关联的值。
遍历字符串
对于字符串,range 会返回两个值:字符的索引(字节位置)和对应的 Unicode 码点(rune)。
str := "Hello, 世界"
for index, runeValue := range str { fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
}
注意,对于非 ASCII 字符(如中文),一个字符可能会占用多个字节。因此,这里的索引是指字节在字符串中的位置,而不是字符在字符串中的位置(对于多字节字符,后者可能更有用,但 Go 的 range 在字符串上不提供这种索引)。
遍历通道
对于通道,range 会持续地从通道中接收数据,直到通道被关闭。
ch := make(chan int)
go func() { for i := 0; i < 5; i++ { ch <- i } close(ch)
}() for value := range ch { fmt.Println(value)
}
在这个例子中,range 会阻塞,直到从通道 ch 中接收到数据。当通道被关闭且没有更多数据可读时,range 循环会结束。
注意事项
当使用 range 遍历映射时,遍历的顺序是随机的,每次运行程序时可能会得到不同的顺序。
在遍历数组、切片或字符串时,如果你只需要索引或值中的一个,可以使用下划线 _ 来忽略另一个。
在遍历通道时,确保通道最终会被关闭,否则 range 循环将永远阻塞。
- range 在内部使用了值拷贝,因此遍历过程中修改元素的值(对于数组和切片)不会影响原始数组或切片。然而,如果你传递的是一个指向元素的指针(例如,切片中的元素是指针类型),则可以通过指针修改原始数据。
3.7 Go语言select语句
select 语句允许你在多个通道操作上进行等待。select 会阻塞,直到其中一个 case 可以运行。如果有多个 case 都准备好了,select 会随机选择一个执行。如果所有的通道都没有准备好,就会执行default块中的代码。
ch1 := make(chan string)
ch2 := make(chan string) go func() { ch1 <- "来自 ch1 的消息"
}() go func() { ch2 <- "来自 ch2 的消息"
}() for i := 0; i < 2; i++ { select { case msg1 := <-ch1: fmt.Println("收到:", msg1) case msg2 := <-ch2: fmt.Println("收到:", msg2) default://代码}
}
执行结果;
四、Go语言的特点
(1)并发支持
内置轻量级的并发机制,称为goroutine,可以通过goroutine和通道,方便地编写并发程序。
(2)高性能
通过优化编译器和运行时环境,以及并发机制地支持,提供了出色地性能。
(3)内存安全
具有内置地垃圾回收机制,避免了常见的内存错误。
(4)跨平台
编译器可以将Go代码编译为机器码,支持多种操作系统和体系结构。
(5)丰富的标准库
涵盖了网络编程、文件操作、加密解密并发编程等各个方面。
相关文章:

Go语言基础语法
一、创建工程 说明: (1)go.mod文件是go项目依赖管理文件,相当于前端的package.json,也就是Java项目中的Maven的pom.xml。 二、打印数据到控制台 (1)引入fmt (2)使用fmt…...
CSS层叠/CSS变量和!important的使用
layer components {:root {--theme: red;font-family: serif !important;} } CSS Layers CSS Layers 是一种用于管理和组织样式规则的新机制。它允许开发者定义不同的样式层,以便更好地控制样式的优先级和覆盖关系。通过使用 layer 规则,开发者可以将样…...

提升工作效率的小众神器
🤖宝子们,今天我要给大家分享五款超实用的小众工作软件,让你的工作事半功倍!😎 🌟亿可达 - 自动化办公神器 亿可达是一款自动化办公工具,无需编程知识就能搭建出各种自动化工作流程。界面清新…...

【Python+Pycharm】2024-Python安装配置教程
【PythonPycharm】2024-Python安装配置教程 一、下载装 Python 1、进入Python官网首页,下载最新的Python版本 Download Python | Python.org 选择对应版本下载 安装 测试安装情况 python如果安装失败 在系统环境变量添加安装路径 where pythonwin7安装路径添加…...

systemverilog中clocking的用法
文章目录 1.clocking简介2.clocking实例分析3.重点分析(1)bus定义是不是随便取名的(2)输入输出的定义原则是什么(3)到底如何消除了竞争和冒险(4)没用到的信号如何处理(5&…...
【Python开发】大模型应用开发项目整理
不知不觉已经入职3个月了,同事很好,工作充实,学到了很多东西,大大小小的需求也实现了接近20个。负责2个主要component,数据抓取和利用GenAI做数据提取。 1 背景 提取新闻中事件关键信息,比如人名ÿ…...

Redis 的使⽤和原理
第一章:初识 Redis 1.1盛赞 Redis Redis 是⼀种基于键值对(key-value)的 NoSQL 数据库,与很多键值对数据库不同的是,Redis 中的值可以是由 string(字符串)、hash(哈希)、list&…...
前端学Java
一:语法 1、注解 注解(Annotation)是Java中的一种特殊类型的语法,它可以被用来为代码提供元数据。元数据是关于数据的数据,注解可以用于类、方法、变量等的描述与标记。 理解注解可以从以下几个方面入手:…...
VR游戏:多人社交将是VR的下一个风口
第一部分:创业笔记 1. 市场趋势 从单机游戏转向多人互动体验:随着技术的进步,VR游戏正从单机模式向多人互动体验转变。代表作品如Rec Room、Phasmophobia、Among Us和Breachers等,这些游戏的成功证明了多人互动模式的巨大潜力。…...
Docker与虚拟机(VM)的不同
Docker与虚拟机(VM)在实现的原理上存在显著的不同,主要体现在以下几个方面: 一、基础原理 Docker 利用Linux内核的特性,如容器(containers)、命名空间(namespaces)和控制…...

Pr 视频效果:透视
效果面板/视频效果/透视 Video Effects/Perspective Adobe Premiere Pro 的视频效果中,透视 Perspective效果组主要用于在二维平面的视频剪辑中模拟三维空间的透视效果。 通过调整这些效果,可以改变图像的视角、添加阴影、创造立体感,增强画面…...
C 语言标准库 - <limit.h>
简介 <limits.h> 是 C 标准库中的一个头文件,定义了各种数据类型的限制。这些宏提供了有关整数类型(char、short、int、long 和 long long 等)和其他数据类型的最大值和最小值的信息。 这些限制指定了变量不能存储任何超出这些限制的…...

Python | Leetcode Python题解之第519题随机翻转矩阵
题目: 题解: class Solution:def __init__(self, m: int, n: int):self.m mself.n nself.total m * nself.map {}def flip(self) -> List[int]:x random.randint(0, self.total - 1)self.total - 1# 查找位置 x 对应的映射idx self.map.get(x,…...

大数据新视界 -- 大数据大厂之提升 Impala 查询效率:索引优化的秘籍大揭秘(上)(3/30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【AI工作流】FastGPT - 深入解析FastGPT工作流编排:从基础到高级应用的全面指南
文章目录 一、工作流编排概述二、FastGPT的节点类型1. 基础功能插件(1) 文本输出(2) 功能调用(3) 工具(4) 外部调用(5) 其他 2. 系统插件3. 团队插件 三、工作流中的流向结语 在当今快速发展的人工智能领域,工作流编排的能力已成为提升用户体验和应用效率的关键因素…...

VS+Qt解决提升控件后,包含头文件格式不对问题处理
一、前言 VSQt 提升控件后,在uic目录下会生成ui相关的初始化文件,对于提升的控件头文件包含的格式为#include<> 而非 #include “ ” 导致无法找到头文件。如果手动修改为 #include “ ”相当麻烦,甚至每次编译都要修改一遍,…...

opencv - py_imgproc - py_filtering filtering 过滤-卷积平滑
文章目录 平滑图像目标2D 卷积(图像过滤)图像模糊(图像平滑)1. 平均2. 高斯模糊3. 中值模糊4. 双边滤波 其他资源 平滑图像 目标 学习: 使用各种低通滤波器模糊图像将定制滤波器应用于图像(2D 卷积&…...

精华帖分享|缠论系列 -笔
本文来源于量化小论坛策略分享会板块精华帖,作者为吴奕萱,发布于2023年6月4日。 以下为精华帖正文: 01 笔 昨天讲了3根K线组合关系的完全分类,按照逻辑,其实我们会考虑是不是应该讲4根、5根K线的组合关系了。 精华帖…...

Java项目实战II基于Spring Boot的文理医院预约挂号系统的设计与实现(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在医疗资源日益紧张的背景下࿰…...

NumPy Ndarray学习
1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...