当前位置: 首页 > news >正文

Go语言入门篇

目录

一、基础数据类型

1.1 变量的定义方式

1.2 用%T输出变量的类型

二、复合数据类型

2.1 数组

2.1.2、数组的遍历

2.1.3 数组传参

2.2. 切片slice

2.2.1. 初始化切片

2.2.2. append向切片中追加元素

2.2.3. 切片的截取

2.3. map

2.3.1. map初始化

2.3.2. 添加和删除

2.3.3. 遍历

2.4. 管道channel

2.4.1. 初始化

2.4.2. 放入和取出元素

2.4.2. 管道的遍历

2.5 结构体

2.5.1. 成员函数(方法)

2.5.2. 匿名结构体

2.5.3. 结构体中含有匿名成员

2.5.4. 结构体指针

2.5.5. 构造函数

2.5.6. 方法接收指针


之前是学习了C/C++,现在开始学go,感觉go和C语言有很多相似的地方。

一、基础数据类型

1.1 变量的定义方式

相比于C++,go变量的定义就显得很灵活多变了

// 定义一个名称为 “variableName” ,类型为 "type" 的变量
var variableName type// 定义并初始化初始化 “variableName” 的变量为 “value” 值,类型是 “type”
var variableName type = value// 定义三个类型都是 “type” 的三个变量
var vname1, vname2, vname3 type
/*
定义并初始化三个类型都是 "type" 的三个变量 , 并且它们分别初始化相应的值
vname1 为 v1 , vname2 为 v2 , vname3 为 v3
*/
var vname1, vname2, vname3 type= v1, v2, v3

批量声明变量:

var (a intb stringc float32d float64...
)

对于变量的类型,我们也是可以直接忽略的:  让系统去给我们自动进行推导

var vname1, vname2, vname3 = v1, v2, v3vname1, vname2, vname3 := v1, v2, v3

:= 这个符号直接取代了 var 和 type , 这种形式叫做简短声明。不过它有一个限制,那就是它只能用在函数内部在函数外部使用则会无法编译通过,所以一般用 var 方式来定义全局变量。

_(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。 在这个例子中,我们将值 32赋予 b ,并同时丢弃 31

_, b := 31, 32

1.2 用%T输出变量的类型

先来试一下正常定义变量

//用%T来输出变量的类型var a intvar b bytevar f float32var t boolfmt.Printf("%T\n", a)fmt.Printf("%T\n", b)fmt.Printf("%T\n", f)fmt.Printf("%T\n", t)

再来试一下简短声明

二、复合数据类型

2.1 数组

一维数组,其实就和C语言没多少区别的

func main() {var arr1 [5]int = [5]int{}var arr2 = [5]int{}var arr3 = [5]int{3, 2}         //给前两个元素赋值,没赋值的默认为0var arr4 = [5]int{2: 15, 4: 6}  //给指定位置的元素赋值var arr5 = [...]int{6, 5, 4, 3} //根据{}里面元素的个数推导出var arr6 = [...]struct {name stringage  int}{{"tome", 18}, {"same", 20}}}

二维数组

	//3行4列,只给前两行赋值,且前两行的所有列还没有赋满var arr = [3][4]int{{1, 2}, {3, 4}}//第一维可以用...推导,第二维不能var arr2 = [...][3]int{{1},{2,3}}

2.1.2、数组的遍历

//数组的遍历//1、比较简便的写法for i, ele := range arr {fmt.Println("index=%d, ele = %d", i, ele)}//2、像C语言一样遍历for i := 0; i < len(arr); i++ {fmt.Println(arr[i])}//3、遍历二维数组for row, array := range arr2 {//先取出一行for col, ele := range array {//再遍历这一行fmt.Println("arr[%d][%d]=%d", row, col, ele)}}

2.1.3 数组传参

package main
import "fmt"//调用f1函数只会拷贝数组
func f1(arr [5]int) {arr[0] += 1
}//f2传入数组的指针,可以修改外面的数组
func f2(arr *[5]int) {//由于go语言会省略掉指针解引用的操作,所以//这样写也可以 arr[0] += 1(*arr)[0] += 1//go语言的for循环没有C++那种引用类型//for循环中,i是arr的下标,n是arr[i]的拷贝,所以修改n不会修改arr[i]//如果想修改数组中的内容,只能使用arr[i]的方式for i, n := range arr {arr[i] = n + 1}
}
func main() {var arr1 [5]int = [5]int{}f1(arr1)fmt.Println(arr1)//[0 0 0 0 0]f2(&arr1)fmt.Println(arr1)//[2 1 1 1 1]
}

2.2. 切片slice

数组不指定大小也不推导大小,则它会是切片类型,切片实际上是一个结构体类型,通过一个指针指向底层的数组,然后通过len和cap两个变量记录数组中数据的长度和数组的大小,有点类似于C++中的vector。

切片(slice)是对底层数组一个连续片段的引用,所以切片是一个引用类型。

2.2.1. 初始化切片

make与new类似,但make只用于slice、map以及channel的初始化(非零值);而new用于类型的内存分配,并且内存置为零。

注意,初始化切片的时候不能够在[]中赋值,否则就变成数组了。

// 定义切片
func main() {var ss1 []int //声明一个切片,但并没有初始化fmt.Println(ss1)var s1 []ints1 = []int{1, 2, 3, 4}fmt.Println(s1)s1 = make([]int, 3) //有点像C++的new,申请内存//输出切片的内容fmt.Println(s1)fmt.Println("len = %d, cap =%d", len(s1), cap(s1))//切片的判空//声明但未使用的切片的默认值是 nil//这里ss1只声明,未经过使用,s1已经使用了,被分配了内存,所以不是nilfmt.Println(ss1 == nil)fmt.Println(s1 == nil)}
2.2.2. append向切片中追加元素

注意:append会返回新的切片,也就是说并不会改变原来的切片,所以一般需要将返回的切片赋值给原来的切片。

var a []int
a = append(a, 1) // 追加1个元素
a = append(a, 1, 2, 3) // 追加多个元素
a = append(a, []int{1,2,3}...) // 追加一个切片
2.2.3. 切片的截取

func sub_slice() {arr := make([]int, 3, 5)crr := arr[0:2] //前闭后开crr[1] = 8fmt.Println(arr[1]) //观察arr【1】会不会影响crr = append(crr, 9)fmt.Println(arr[2])
}

运行一下,观察结果:

2.3. map

这里的map就相当于C++中的map,底层都通过哈希表实现。

2.3.1. map初始化

2.3.2. 添加和删除

2.3.3. 遍历

2.4. 管道channel

2.4.1. 初始化

管道是无法扩容的

2.4.2. 放入和取出元素

2.4.2. 管道的遍历

channel支持for-range的方式进行遍历,请注意几个细节

1、在遍历的时候,如果channel没有关闭,则会出现deadlock的错误。

2、在遍历的时候,如果channel已经关闭,则会正常遍历数据,遍历完后会退出遍历。

3、遍历管道相当于从管道之中读取数据,也就是说,如果遍历完成,管道将会为空。

4、管道关闭以后不能够再打开,如果想接着使用管道,可以再创建一个。

5、当管道长度满了以后,如果没有人取走数据,则无法继续往管道中写,会报死锁错误(因为需要阻塞住,等管道中的数据被读走才能继续写)

6、当管道空了以后,如果不关闭管道,继续读会报死锁错误(因为管道空了以后,继续读会被阻塞住)。如果关闭管道,为空时继续读则会读取默认值(比如int类型的管道,读取0)。

7、管道关闭以后,可以继续从管道中读取数据,但是不能写入数据。

2.5 结构体

关于结构体类名以及成员变量,第一个字母是否大写,关乎到能否跨包访问,如果结构体类名首字母大写,则可以在其他包内使用该结构体,成员变量首字母大写,则可以在其他包内通过该结构体访问到该成员变量。

2.5.1. 成员函数(方法)

一般函数的定义方式为:

func 函数名(变量名 变量类型)返回值类型{//函数体
}

而成员方法,则只需要在func和函数名中间加上结构体的名字和类型即可

func (对象名 结构体)函数名(变量名 变量类型)返回值类型{//函数体
}

代码展示:

2.5.2. 匿名结构体

2.5.3. 结构体中含有匿名成员

2.5.4. 结构体指针

2.5.5. 构造函数

go语言中没有构造函数和析构函数,因为gc能够自动帮我们回收不需要的内存空间,但为了和其他语言相符合,我们可以模拟实现一个构造函数。

构造函数的名字可以随便起:

2.5.6. 方法接收指针

这个和C语言相同,就是传值和传指针的区别。

相关文章:

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…...

基于springboot+vue的青年公寓服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Spring-ImportSelector接口功能介绍

ImportSelector接口是至spring中导入内部类或者外部类的核心接口&#xff0c;只需要其定义的方法内返回需要创建bean的class字符串就好了&#xff0c;比如&#xff1a;当我们引入一个外部share包&#xff0c;我们拿到里面的Class返回出去&#xff0c;就能得到这个bean,是多么神…...

YOLOv5如何训练自己的数据集

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型4、参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集&#xff08;YOLO版&#xff09;点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…...

李航老师《统计学习方法》第1章阅读笔记

1.1 统计学习 统计学习的特点 统计学习&#xff1a;计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析 现在人们提及机器学习时&#xff0c;往往指统计机器学习&#xff0c;所以可以认为本书介绍的是机器学习方法 统计学习的对象 统计学习研究的对象是数据(data)…...

基于微信小程序的背单词学习激励系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉…...

VScode调试复杂C/C++项目

以前都是用的VScode调试c/cpp的单个文件的编译和执行, 但是一遇到大型项目一般就用gdb了, gdb的调试效率和VScode差距还是比较大的, 但最近发现VScode其实也能调试复杂的cpp项目, 所以记录一下. 首先明确一下几点: 首先cpp文件需要经过编译, 生成可执行文件, 然后通过运行/调…...

【Hash表】字母异位词分组-力扣 49 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

展示日志log4.properties

log4.properties 1.log4.properties 此时文件主要用于展示日志的输出的级别的信息。 # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategoryINFO, CONSOLE debug info warn error fatal log4j.rootCategoryinfo, CONSO…...

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…...

uniapp项目实践总结(十九)版本更新和热更新实现方法

导语:当一个 APP 应用开发完成以后,就要上架应用商店,但有时候修改一些小问题或者推出一些活动,又不想频繁地提交应用商店审核,那么就可以使用应用内更新功能来进行应用的版本升级更新或热更新,下面就介绍一下实现的方法。 目录 准备工作原理分析实战演练案例展示准备工作…...

一起学数据结构(8)——二叉树中堆的代码实现

在上篇文章中提到&#xff0c;提到了二叉树中一种特殊的结构——完全二叉树。对于完全二叉树&#xff0c;在存储时&#xff0c;适合使用顺序存储。对于非完全二叉树&#xff0c;适合用链式存储。本文将给出完全二叉树的顺序结构以及相关的代码实现&#xff1a; 1. 二叉树的结构…...

Linux环境变量配置说明(配置jdk为例-摘录自尚硅谷技术文档)

配置环境变量的不同方法 Linux的环境变量可在多个文件中配置,如/etc/profile&#xff0c;/etc/profile.d/.sh&#xff0c;~/.bashrc&#xff0c;~/.bash_profile等&#xff0c;下面说明上述几个文件之间的关系和区别。 bash的运行模式可分为login shell和non-login shell。 例…...

idea常用插件笔记

文章目录 Free Mybatis Toollombok插件idea插件导出导入 idea提供了很多好用的插件&#xff0c;之前都装了的&#xff0c;但是换了下电脑&#xff0c;什么都没了&#xff0c;所以记录下方便以后用。 Free Mybatis Tool mybatis跳转插件&#xff0c;再也不用费力的找xml了。 l…...

搜索二叉树【C++】

文章目录 二叉搜索树二叉搜索树的模拟实现构造函数拷贝构造函数赋值运算符重载函数析构函数Insert循环递归 Erase循环递归 Find循环递归 二叉搜索树的应用K模型KV模型 完整代码普通版本递归版本 二叉搜索树 二叉搜索树又称为二叉排序树&#xff0c;它或者是一棵空树&#xff0…...

华为云云耀云服务器L实例评测|认识redis未授权访问漏洞 漏洞的部分复现 设置连接密码 redis其他命令学习

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;数据丢失&#xff0c;还好我有几份备份&#xff0c;没有造成太大的损失。昨天收到华为云的邮箱提醒&#xff0c;我的redis数据库没有设置密码&…...

快速安装NGINX

快速安装NGINX #安装依赖包 yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel#下载NGINX curl -O https://nginx.org/download/nginx-1.21.6.tar.gz#解压NGINX tar -zxvf nginx-1.21.6.tar.gz cd nginx-1.21.6.tar.gz#配置 ./configure --prefix/…...

一台电脑远程内网的另外一台电脑,禁止远程的电脑连接外网,只允许内网连接

一台电脑远程内网的另外一台电脑&#xff0c;禁止远程的电脑连接外网&#xff0c;只允许内网连接 1.找到右下角网卡图标&#xff0c;右键图标选择“打开网络和共享中心”。 3、点击“更改适配器设置”。 4、右键正在使用的网卡“本地连接”打开属性 5、找到“internet协…...

山西电力市场日前价格预测【2023-09-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-09-24&#xff09;山西电力市场全天平均日前电价为496.09元/MWh。其中&#xff0c;最高日前电价为705.54元/MWh&#xff0c;预计出现在14: 30。最低日前电价为333.70元/MWh&#xff0c;预计…...

MQ---第二篇

系列文章目录 文章目录 系列文章目录一、RabbitMQ事务消息二、RabbitMQ死信队列、延时队列一、RabbitMQ事务消息 通过对信道的设置实现 channel.txSelect();通知服务器开启事务模式;服务端会返回Tx.Select-Okchannel.basicPublish;发送消息,可以是多条,可以是消费消息提交…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...