Go语言入门篇

news2024/11/25 13:28:57

目录

一、基础数据类型

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 int
    b string
    c float32
    d float64
    ...
)

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

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

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

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

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

_, b := 31, 32

1.2 用%T输出变量的类型

先来试一下正常定义变量

//用%T来输出变量的类型
	var a int
	var b byte
	var f float32
	var t bool

	fmt.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}         //给前两个元素赋值,没赋值的默认为0
	var arr4 = [5]int{2: 15, 4: 6}  //给指定位置的元素赋值
	var arr5 = [...]int{6, 5, 4, 3} //根据{}里面元素的个数推导出
	var arr6 = [...]struct {
		name string
		age  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 []int
	s1 = []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已经使用了,被分配了内存,所以不是nil
	fmt.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] = 8
	fmt.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.coloradmin.cn/o/1036629.html

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

相关文章

CSS3有哪些新特性

CSS3 引入了许多新特性&#xff0c;以增强样式设计和页面布局的能力&#xff0c;提供更多的视觉效果和交互性。以下是一些 CSS3 中的新特性&#xff1a; 圆角边框&#xff08;Border Radius&#xff09;&#xff1a;圆角的边框&#xff0c;而不是传统的方形边框。 <!DOCTY…

GLTF编辑器告诉你凹凸贴图的作用

什么是凹凸贴图 凹凸贴图&#xff08;Bump Mapping&#xff09;是一种计算机图形学中的技术&#xff0c;用于在表面上模拟微小的凹凸形状&#xff0c;从而增加了物体的细节和真实感。它可以在不改变物体几何形状的情况下&#xff0c;通过修改光照的反应&#xff0c;使表面看起来…

华为云云耀云服务器L实例评测 | WebVR性能测试

随着最近几年Web技术的快速发展&#xff0c;Web3D和WebVR在网页端效果越来越好。 本文讲述如何在云耀云服务器L实例上部署WebVR服务器&#xff0c;服务器代码里添加一个3D模型&#xff0c;然后再使用本地浏览器作为客户端来查看模型加载和交互情况&#xff0c;并体验WebVR。 …

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

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

Python绘制二元函数图像

1 问题 利用python来解决绘制二元函数图像的问题。 2 方法 用文字描述解题思路&#xff0c;可配合一些图形以便更好的阐述。解决问题的步骤采用如下方式&#xff1a; 注意下述步骤全部使用(1)格式。 需要调用两个第三方库;Matplotlib、numpy编写代码绘制f(x,y)(sin(x)*sin(y))/…

云上亚运:所使用的高新技术,你知道吗?

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前言 一.什么是云上亚运会 二.为什么要使用云…

Python字典的增删改查以及嵌套

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程&#xff0c;尽在下方&#xff0c;赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都准备好了&#xff0c;直接在文末名片自取就可 字典 基础数…

Java客户端_Apache Curator操作Zookeeper

Curator是 Netflix公司开源的一套ZooKeeper客户端框架。和ZkClient一样&#xff0c;Curator解决了很多ZooKeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和 NodeExistsException异常等&#xff0c;目前已经成为了Apache的顶级项目,是全世界范围…

基于若依ruoyi-nbcio增加flowable流程待办消息的提醒,并提供右上角的红字数字提醒(七)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 接下来需要进行点击消息进行操作的动作。 1、首先先导入这个更新用户消息的一些菜单与权限&#xff0c;以…

python随手小练4

题目&#xff1a; 写一段python代码判断一句话是否是回文 具体操作&#xff1a; n input("请输入需判断的语句&#xff1a;") #因为input默认为字符串类型 if n[ : :-1] n[: :]:print("是回文") else:print("不是回文") 结果展示&#xff1a…

最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

华为云云耀云服务器L实例评测|centos7.9配置java环境变量安装tomcat 部署war和jar

文章目录 ⭐前言⭐配置jdk环境&#x1f496; 选择linux x64 archive&#x1f496; 云耀服务器控制台使用cloudShell ⭐配置tomcat环境&#x1f496; wget下载解压包&#x1f496; 运行tomcat&#x1f496; 控制台开放8080端口访问部署tomcat成功&#xff01; ⭐java运行jar⭐to…

VS Code 自动选择Python3 venv

我们使用VS Code写Python代码时&#xff0c;往往希望这个项目的依赖和其他项目或者全局的python环境隔离开&#xff0c;VS Code不像PyCharm那样自动完成&#xff0c;但是我们也可以快速的进行设置. 首先我们需要把python项目所在的目录添加为VS Code的Workspace 添加成works…

7.6 实现进程挂起与恢复

挂起与恢复进程是指暂停或恢复进程的工作状态&#xff0c;以达到一定的控制和管理效果。在 Windows 操作系统中&#xff0c;可以使用系统提供的函数实现进程的挂起和恢复&#xff0c;以达到对进程的控制和调度。需要注意&#xff0c;过度使用进程挂起/恢复操作可能会造成系统性…

基于or-tools的护士排班问题建模求解

基于or-tools的护士排班问题建模求解 护士排班问题&#xff08;Nurse Rostering Problem&#xff0c;NRP&#xff09;ortools官网例题1&#xff1a;A nurse scheduling problem代码解析完整代码 ortools官网例题2&#xff1a;Scheduling with shift requests代码解析完整代码 …

比特币的蒙提霍尔问题

把钱放在嘴边 我们在比特币上建立了蒙提霍尔问题模拟。 如果您知道概率谜题的正确答案&#xff0c;不仅炫耀您的数学技能&#xff0c;还会获得金钱奖励。 它完全无需信任地在链上运行。 蒙提霍尔问题 蒙提霍尔问题&#xff08;三门问题&#xff09;是一个以蒙提霍尔命名的概率…

Redis桌面管理工具Redis Desktop Manager mac中文版功能特色

Redis Desktop Manager for Mac是一款实用的Redis可视化工具。RDM支持SSL / TLS加密&#xff0c;SSH隧道&#xff0c;基于SSH隧道的TLS&#xff0c;为您提供了一个易于使用的GUI&#xff0c;可以访问您的Redis数据库并执行一些基本操作&#xff1a;将键视为树&#xff0c;CRUD键…

计算机网络工程师多选题系列——操作系统

得多选者得天下啊同志们&#xff01; 摘录按照章节顺序&#xff0c;但事实上各章节习题有交叉。 1 操作系统 1.1 操作系统概论 操作系统的主要功能&#xff1a;进程管理、存储管理、文件管理、设备管理和用户接口。 操作系统的主要功能——设备管理&#xff1a;为用户程序提…

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验证漏洞(数字型注入) 状态码区分正确与错误 做比较的时候不能采用…

实现顺序表——实践报告

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 目录 一、实验目的&#xff1a; 二、实验内容&#xff1a; 三、实验要求&#xff1a; 四.实验步骤&#xff08;给出每个函数的算法描述&#xff09;&#xff1a; 五.实验结果&#xff1a; 六.源代码 实验名称 &am…