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)丰富的标准库
涵盖了网络编程、文件操作、加密解密并发编程等各个方面。

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

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

相关文章

【数据结构】二叉树——层序遍历

层序遍历 一、层序遍历二、层序遍历&#xff08;递归&#xff09;三、层序遍历&#xff08;非递归&#xff09;四、总结 一、层序遍历 层序遍历是一种广度优先遍历 以图上二叉树为例&#xff0c;层序遍历就是按照二叉树的深度一层一层进行遍历 遍历顺序&#xff1a; A B C D …

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…

Pandas 数据清洗

1.数据清洗定义 数据清洗是对一些没有用的数据进行处理的过程。很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况&#xff0c;如果要使数据分析更加准确&#xff0c;就需要对这些没有用的数据进行处理。 2.清洗空值 DataFrame.dropna(axis0, howany, threshN…

【GL08】STM32--ADC/DAC

一、ADC简介 ADC 即模拟信号到数字信号的转换&#xff0c;即用数字信号展现模拟的世界&#xff0c;所有的计算机或者数字处理器只能接受以 0 和 1 两种状态的数字信号&#xff0c;而对于模拟信号&#xff0c;则无法识别&#xff0c;而需要经过模拟数字转换器来感受模拟的世界。…

Blender进阶:着色器节点

11 着色器节点 11.1着色器 着色器Shader&#xff0c;负责给物体表面着色。 综合以下参数&#xff1a; -基础色-金属度、粗超度、透明度-法向-入射光颜色、强度、角度。。 着色器本质上是一段程序、算法&#xff0c;即着色器编程。 在节点编辑器中&#xff0c;支持算法的可…

SQLark百灵连接——整合项目监控过程

关键词&#xff1a;SQL编写、数据查询、数据导入、达梦数据库、项目管理、信息透明 项目监控背景 作为新手项目经理的我&#xff0c;经常觉得哪儿哪儿都是问题&#xff0c;今天催这个&#xff0c;明天推那个&#xff0c;可就是什么事都推不动&#xff0c;谁都不配合。后来&…

ELK配置转存redis缓存,采集nginx访问日志

在136服务器上部署mysql 启动mysql服务 可通过以下命令查找安装的软件包 怎么查找安装软件的日志文件位置rpm -qc mysql-server&#xff0c;即可显示mysql.log位置 也可通过查找配置文件中的log关键字来查找log文件日志位置 用awk命令&#xff0c;以切割&#xff0c;输出第二个…

提升当当网数据爬取效率:代理IP并发抓取技术

在当今的互联网时代&#xff0c;数据已成为企业竞争的关键资源。爬虫技术作为获取网络数据的重要手段&#xff0c;其应用范围越来越广泛。然而&#xff0c;随着各大网站反爬虫机制的不断加强&#xff0c;爬虫面临着越来越多的挑战。其中&#xff0c;IP被封禁是最常见的问题之一…

基于微信小程序的图书馆座位预约系统+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

学习笔记:ElasticSearch搜索引擎

学习视频&#xff1a;【尚硅谷】ElasticSearch教程入门到精通&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 学习笔记&#xff1a;Elasticsearch学习笔记 目录 第1章 Elasticsearch概述01. 开篇02. 技术选型 2. 第二章 ElasticSearch入门03. 环境准备04. …

Vue Router进阶详解

导航守卫 若依框架登录鉴权详解&#xff08;动态路由&#xff09;_若依鉴权-CSDN博客 完整的导航解析流程 导航被触发&#xff1a; 当用户点击页面中的链接、使用编程式导航&#xff08;如router.push或router.replace&#xff09;或手动输入URL时&#xff0c;导航流程被触发。…

力扣排序242题 有效的子母异位词

题目&#xff1a; 242.有效的字母异位词 给定两个字符串s和t &#xff0c;编写一个函数来判断 t是否是s的字母异位词。 示例1: 输入: s "anagram", t "nagaram" 输出: true 解题思路&#xff1a; 要判断两个字符串s和t是否为子母异位词&#xff0c;也…

html简易流程图

效果图 使用htmlcssjs&#xff0c;无图片&#xff0c;没用Canvas demo: <!DOCTYPE html> <html> <head><link href"draw.css" rel"stylesheet" /><script src"draw.js" type"text/javascript"></…

51单片机教程(一)- 开发环境搭建

1、开发环境搭建 1 环境准备 1 单片机介绍 单片机&#xff08;Single-Chip Microcomputer&#xff0c;简称MCU&#xff09;是一种集成电路芯片&#xff0c;是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第3天,分析项目结构

24.11.02 1.分析项目初始结构 IDEA有2种查看Android项目模式&#xff0c;一种是原始的projects模式&#xff0c;重点介绍这个模式下的项目结构 Android模式下的项目结构 这个是经过Android处理后的&#xff0c;并不是真正的项目结构&#xff0c;但是看着很简洁 projects模式…

chrome编辑替换js文件的图文教程

一、找到要修改替换的js文件 二、将文件保存到本地 三、在本地新建一个文件 路径最好跟你要替换的文件的路径保持一致&#xff0c; 四、选中js文件替换 回到原文件右击选择保存并覆盖 点击完保存并覆盖之后回到替换的新文件中&#xff0c;在自动生成的webpack文件中对文件进…

大学城水电管理:Spring Boot应用案例

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学城水电管理系统的相关信息成为必然。开…

硅谷15菜单权限

菜单权限 15.1 路由的拆分 15.1.1 路由分析 菜单的权限: 超级管理员账号:admin atguigu123 拥有全部的菜单、按钮的权限 飞行员账号 硅谷333 111111 不包含权限管理模块、按钮的权限并非全部按钮 同一个项目&#xff1a;不同人(职位是不一样的,他能访问到的菜单、…

3D Gaussian Splatting代码详解(二):模型构建

3 模型构建 gaussians GaussianModel(dataset.sh_degree) 3.1 初始化函数 __init__ 构造函数 构造函数 __init__ 的主要作用是初始化 3D 高斯模型的各项参数和激活函数&#xff0c;用于生成 3D 空间中的高斯表示。 初始化球谐函数的参数&#xff1a; self.active_sh_degre…

初知C++:继承

文章目录 1. 继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承基类成员访问方式的变化 2.基类和派生类间的转换3. 继承中的作用域3.1 隐藏规则3.2 考察继承作用域相关选择题 4. 派生类的默认成员函数4.1 4个常见默认成员函数4.2实现一个不能被继承的类 5. …