当前位置: 首页 > 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;发送消息,可以是多条,可以是消费消息提交…...

终极指南:TwitchAdSolutions自定义播放器与备用流高级配置技巧

终极指南&#xff1a;TwitchAdSolutions自定义播放器与备用流高级配置技巧 【免费下载链接】TwitchAdSolutions 项目地址: https://gitcode.com/gh_mirrors/tw/TwitchAdSolutions TwitchAdSolutions是一款强大的Twitch广告拦截工具&#xff0c;通过自定义播放器类型与备…...

OpenTiny NEXT 从入门到精通·第 1 篇

OpenTiny NEXT 从入门到精通第 1 篇&#xff1a;启程篇——初识 OpenTiny NEXT&#xff0c;开启企业级智能前端之旅前端技术日新月异&#xff0c;Vue 2 要停止维护了&#xff0c;团队还在 Vue 2/3 多版本并存中挣扎&#xff1b;业务方希望接入 AI&#xff0c;前端却不知道怎么开…...

OpenClaw小团队协作:Qwen3.5-9B共享模型端点的权限管理

OpenClaw小团队协作&#xff1a;Qwen3.5-9B共享模型端点的权限管理 1. 为什么小团队需要共享OpenClaw实例 去年我们实验室遇到一个典型问题&#xff1a;五个研究员共用三台GPU服务器&#xff0c;每个人都想用OpenClaw做自动化实验&#xff0c;但各自部署不仅浪费资源&#xf…...

OpenClaw多模态调试台:交互式测试Kimi-VL-A3B-Thinking的chainlit技巧

OpenClaw多模态调试台&#xff1a;交互式测试Kimi-VL-A3B-Thinking的chainlit技巧 1. 为什么需要多模态调试台 上周我在开发一个基于Kimi-VL-A3B-Thinking的智能客服原型时&#xff0c;遇到了一个典型问题&#xff1a;模型对图片中文字的识别时好时坏。有时能准确提取发票金额…...

通义千问API调用避坑指南:从环境变量失效到流式输出卡顿,我踩过的坑都在这了

通义千问API实战避坑手册&#xff1a;环境变量、流式输出与模型选择的深度优化 当开发者第一次接触通义千问API时&#xff0c;往往会被其强大的功能和简洁的文档所吸引。然而在实际集成过程中&#xff0c;各种"玄学"问题接踵而至——从环境变量神秘失效到流式输出莫名…...

链表(两数相加)(1)

一.题目 2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 二.思路讲解 2.1 审题 题目给出两个非空链表&#xff0c;每个链表表示一个非负整数&#xff0c;并且数字是逆序存储的&#xff0c;即链表的头节点对应数字的最低位。例如&#xff0c;链表 2->4->3 表示数字…...

从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集

从标注到训练&#xff1a;手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集 在计算机视觉领域&#xff0c;关键点检测技术正逐渐成为研究热点。无论是人体姿态估计、面部表情识别还是工业质检中的零件定位&#xff0c;准确的关键点检测都是实现这些应用的基础。然而&…...

CSS如何通过Sass循环生成辅助类_批量创建颜色或间距样式

用each遍历颜色映射生成辅助类最高效&#xff0c;需确保颜色值为真实类型而非字符串&#xff1b;for生成间距应从1开始并保证$i为数值&#xff1b;动态算色时避免对rgba()直接调用lighten/darken&#xff0c;推荐mix或分离alpha处理。怎么用 each 生成颜色辅助类直接遍历颜色映…...

单片机IO口扩展方案全解析与应用实践

1. 单片机IO口扩展的必要性与挑战作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我经常遇到这样的场景&#xff1a;项目进行到一半&#xff0c;突然发现单片机GPIO口不够用了。这种"资源危机"在中小型项目中尤为常见&#xff0c;特别是当我们使用8位或低引脚…...

B端管理后台原型设计进阶:从8大案例拆解到高效设计策略落地

1. 从案例拆解到设计策略的进阶路径 刚入行做B端设计那会儿&#xff0c;我总以为管理后台就是把功能堆砌在页面上。直到接手第一个供应链系统项目时&#xff0c;看到用户对着满屏按钮手足无措的样子才恍然大悟——好的B端设计不是功能的集装箱&#xff0c;而是业务的翻译官。这…...