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语言相同,就是传值和传指针的区别。

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

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

相关文章

操作系统权限提升(三十)之数据库提权-SQL Server sp_oacreate+sp_oamethod(dba权限)提权

SQL Server sp_oacreate+sp_oamethod(dba权限)提权 sp_oacreate+sp_oamethod介绍 在xp_cmdshell被删除或不能利用是可以考虑利用sp_oacreate,利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql)。sp_oacreate 是一个存储过程,可以…

【无标题】mysql 普通用户连接报错: MySql server has gone away

1、mysql 普通用户连接报错&#xff1a; MySql server has gone away 2、进入mysql错误日志位置查看输出日志显示错误为&#xff1a; [Warning] [MY-013130] [Server] Aborted connection 47 to db: unconnected user: tjcx host: 10.195.11.4 (init_connect command failed; …

基于docker进行Grafana + prometheus实现服务监听

基于docker进行Grafana Prometheus实现服务监听 Grafana安装Prometheus安装Jvm监控配置服务器主机监控(基础cpu&#xff0c;内存&#xff0c;磁盘&#xff0c;网络) Grafana安装 docker pull grafana/grafanamkdir /server/grafanachmod 777 /server/grafanadocker run -d -p…

汽车OTA

汽车OTA&#xff08;Over-The-Air&#xff09;技术是指通过无线网络对汽车进行软件升级、数据传输和远程诊断等功能的技术。随着汽车行业的数字化和智能化发展&#xff0c;OTA技术在汽车领域的应用越来越广泛&#xff0c;对于提高汽车性能、降低维修成本和提升用户体验具有重要…

Linux(ubuntu)系统更新后不能进入图形界面

最近需要跑一个深度学习的程序&#xff0c;把许久没用的ubuntu系统调了出来&#xff0c;手欠的我更新了一下系统&#xff0c;结果再启动&#xff0c;系统就只停留在光标闪动那里&#xff0c;不能看到图形界面了。网上查了一下&#xff0c;说是因为更新后&#xff0c;显卡驱动没…

Scrapy+Selenium自动化获取个人CSDN文章质量分

前言 本文将介绍如何使用Scrapy和Selenium这两个强大的Python工具来自动获取个人CSDN文章的质量分数。我们将详细讨论Scrapy爬虫框架的使用&#xff0c;以及如何结合Selenium浏览器自动化工具来实现这一目标。无需手动浏览每篇文章&#xff0c;我们可以轻松地获取并记录文章的…

MySQL常见join关联查询分析

1、join关联查询七大类型结构图 2、建表语句 CREATE TABLE t_dept (id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEINNODB AUTO_INCREMENT1 DEFAULT CHARSETutf8;CREATE TABLE t_emp (id…

Go 并发可视化解释 - sync.Mute

在学习 Go 编程语言时&#xff0c;您可能会遇到这句著名的格言&#xff1a;“不要通过共享内存来进行通信&#xff1b;相反&#xff0c;通过通信来共享内存。” 这句话构成了 Go 强大并发模型的基础&#xff0c;其中通道&#xff08;channels&#xff09;作为协程之间的主要通信…

搭建安信可小安派Windows 开发环境

搭建小安派Windows 开发环境 Ai-Pi-Eyes 系列是安信可开源团队专门为Ai-M61-32S设计的开发板&#xff0c;支持WiFi6、BLE5.3。所搭载的Ai-M61-32S 模组具有丰富的外设接口&#xff0c;具体包括 DVP、MJPEG、Dispaly、AudioCodec、USB2.0、SDU、以太网 (EMAC)、SD/MMC(SDH)、SP…

操作系统真象还原_访问vaddr对应的pte

须知&#xff1a; 只要开启了分页机制&#xff0c;不管物理地址还是虚拟地址在CPU面前都按照分页处理&#xff0c;也就是即便给出物理地址CPU也按虚拟地址对待。 为什么没有出现页目录表结构体&#xff0c;也没有页目录项结构体。页目录表在某一块内存中&#xff0c;页表也在某…

存储管理详解

目录 存储管理&#xff08;1&#xff09; 第一节 存储管理概述&#xff08;内存管理&#xff09; 一、存储体系 二、存储管理的任务 三、地址转换 存储管理&#xff08;2&#xff09; 第二节 分区管理方案 一、固定分区 二、可变分区 三、分区管理方案的优缺点 第…

docker openjdk:8-jdk-alpine 修改时区、添加字体

新建Dockerfile文件&#xff0c;制作新镜像 FROM openjdk:8-jdk-alpine 1、解决字体问题 RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* 2、解决时差问题 # 解决时差8小时问题ENV TZAsia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /et…

Docker部署Nacos注册中心

文章目录 一、部署MySQL数据库并导入Nacos初始化SQL二、部署Nacos注册中心三、验证Nacos 一、部署MySQL数据库并导入Nacos初始化SQL 1、准备工作 docker pull mysql:8.0.27 Pwd"/data/software/mysql" mkdir ${Pwd}/{data,logs} -p chmod 777 ${Pwd}/logs2、添加配…

metinfo_5.0.4 EXP Python脚本编写

文章目录 metinfo_5.0.4EXP编写SQL注入漏洞 metinfo_5.0.4EXP编写 SQL注入漏洞 漏洞点&#xff1a;/about/show.php?langcn&id22 http://10.9.75.142/metInfo_5.0.4/about/show.php?langcn&id22验证漏洞(数字型注入) 状态码区分正确与错误 做比较的时候不能采用…

【计算机网络笔记二】网络层

IP 地址分类和子网掩码 IPv4 地址—简称 IP 地址&#xff0c;IP 地址由 32 位比特组成 IP地址现在由因特网名字和数字分配机构 ICANN&#xff08;Internet Corporation for Assigned Names and Numbers&#xff09;进行分配&#xff0c;IP地址的作用&#xff1a;用于网络寻址&…

猴赛雷 ! 上次我见过这么厉害的安全测试实战演练还是上次!

01、概念介绍 1.1 xss XSS 攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是 JavaScript&#xff0c;但实际上也可以包括 Java、 VBScript、Acti…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

Arduino驱动MMA7260三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 Arduino驱动MMA7260三轴加速度传感器芯片,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。 1

hadoop测试环境sqoop使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Sqoop看这篇文章就够了_must contain $conditions in where clause._SoWhat1412的博客-CSDN博客 大数据环境 C:\Windows\System32\drivers\etc 修改ip和hostname的对应关系 1…

第75步 时间序列建模实战:多步滚动预测 vol-3(以决策树回归为例)

基于WIN10的64位系统演示 一、写在前面 上两期&#xff0c;我们讲了多步滚动预测的第两种策略&#xff1a; 对于重复的预测值&#xff0c;取平均处理。例如&#xff0c;&#xff08;1,2,3&#xff09;预测出3.9和4.5&#xff0c;&#xff08;2,3,4&#xff09;预测出5.2和6.…