Go语言学习第一天

Go语言简介

  1. go语言的特性:

    • 一个目录下的同级文件属于同一个包。

    • 包名可以与其目录名不同 ?。

    • main包是Go语言程序的入口包,一个Go语言程序必须有且仅有一个main包,如果一个程序没有main包,那么编译事就会出错,无法生成可执行文件。(main函数只能声明在main包中)

  2. 导入的包中不能含有代码中没有使用的包,否则Go编译器会出错。

    import(

    "name1"

    "name2"

    )

  3. func 函数名 (参数列表) (返回值列表) {

    函数体

    }

    • go build 命令可以将Go语言程序代码编译成二进制的可执行文件,但是需要我们手动运行该二进制文件;

    • go run 命令则更加方便,它会在编译后直接运行Go语言程序,编译过程中会产生一个临时文件,但不会生成可执行文件,这个特点很适合用来调试程序

Go语言基本语法

    • var 变量名 变量类型

    • 当一个变量被声明之后,系统自动赋予它该类型的零值:int 为 0,float 为 0.0,bool 为 false,string 为空字符串,指针为 nil 等。所有的内存在 Go 中都是经过初始化的

    • var (a intb stringc []float32d func() boole struct {x int}
      )
    • 名字 := 表达式 (简短变量声明被广泛用于大部分的局部变量的声明和初始化。var 形式的声明语句往往是用于需要显式指定变量类型地方,或者因为变量稍后会被重新赋值而初始值无关紧要的地方)

      • 定义变量,同时显式初始化

      • 不能提供数据类型

      • 只能用在函数内部

    • 匿名变量 _ 将被抛弃

    • 作用域 (Go语言会在编译时检查每个变量是否使用过,一旦出现未使用的变量,就会报编译错误。如果不能理解变量的作用域,就有可能会带来一些不明所以的编译错误。)

      • 函数内定义的变量称为局部变量

      • 函数外定义的变量称为全局变量 (在函数体外声明的变量称之为全局变量,全局变量只需要在一个源文件中定义,就可以在所有源文件中使用,当然,不包含这个全局变量的源文件需要使用“import”关键字引入全局变量所在的源文件之后才能使用这个全局变量。)(全局变量声明必须以 var 关键字开头,如果想要在外部包中使用全局变量的首字母必须大写)

      • 函数定义中的变量称为形式参数

    • Go语言同时提供了有符号和无符号的整数类型,其中包括 int8、int16、int32 和 int64 四种大小截然不同的有符号整数类型,分别对应 8、16、32、64 bit(二进制位)大小的有符号整数,与此对应的是 uint8、uint16、uint32 和 uint64 四种无符号整数类型。

    • 浮点类型

      • 常量 math.MaxFloat32 表示 float32 能取到的最大数值,大约是 3.4e38;

      • 常量 math.MaxFloat64 表示 float64 能取到的最大数值,大约是 1.8e308;

      • float32 和 float64 能表示的最小值分别为 1.4e-45 和 4.9e-324

      • 一个 float32 类型的浮点数可以提供大约 6 个十进制数的精度,而 float64 则可以提供约 15 个十进制数的精度,通常应该优先使用 float64 类型,因为 float32 类型的累计计算误差很容易扩散,并且 float32 能精确表示的正整数并不是很大。

        • var f float32 = 16777216 // 1 << 24
          fmt.Println(f == f+1)    // "true"!
      • 浮点数在声明的时候可以只写整数部分或者小数部分

        • const e = .71828 // 0.71828
          const f = 1.     // 1
      • 很小或很大的数最好用科学计数法书写,通过 e 或 E 来指定指数部分

        • const Avogadro = 6.02214129e23  // 阿伏伽德罗常数
          const Planck   = 6.62606957e-34 // 普朗克常数
          ​
      • 用 Printf 函数打印浮点数时可以使用“%f”来控制保留几位小数

    • 复数 Go语言中复数的类型有两种,分别是 complex128(64 位实数和虚数)和 complex64(32 位实数和虚数),其中 complex128 为复数的默认类型

      • var name complex128 = complex(x, y)

      • name := complex(x, y)

      • 对于一个复数z := complex(x, y),可以通过Go语言的内置函数real(z)来获得该复数的实部,也就是 x;通过imag(z)获得该复数的虚部,也就是 y

      • 复数也可以用==!=进行相等比较,只有两个复数的实部和虚部都相等的时候它们才是相等的

    • Go语言中不允许将整型强制转换为布尔型

    • 定义字符串

      • 可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果,常用的转义字符包括:

        • \n:换行符

        • \r:回车符

        • \t:tab 键

        • \u 或 \U:Unicode 字符

        • \:反斜杠自身

      • 在Go语言中,使用双引号书写字符串的方式是字符串常见表达方式之一,被称为字符串字面量(string literal),这种双引号字面量不能跨行,如果想要在源码中嵌入一个多行字符串时,就必须使用```反引号

        • const str = `第一行
          第二行
          第三行
          \r\n
          `
          fmt.Println(str)
    • Go语言的字符有以下两种:

      • 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。

        • 在 ASCII 码表中,A 的值是 65,使用 16 进制表示则为 41,所以下面的写法是等效的:

          var ch byte = 65 或 var ch byte = '\x41' //(\x 总是紧跟着长度为 2 的 16 进制数)

          另外一种可能的写法是\后面紧跟着长度为 3 的八进制数,例如 \377

      • 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型

        • Go语言同样支持 Unicode(UTF-8),因此字符同样称为 Unicode 代码点或者 runes,并在内存中使用 int 来表示。在文档中,一般使用格式 U+hhhh 来表示,其中 h 表示一个 16 进制数。

        • 在书写 Unicode 字符时,需要在 16 进制数之前加上前缀\u或者\U。因为 Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。如果需要使用到 4 字节,则使用\u前缀,如果需要使用到 8 个字节,则使用\U前缀。

      • var ch int = '\u0041'
        var ch2 int = '\u03B2'
        var ch3 int = '\U00101234'
        fmt.Printf("%d - %d - %d\n", ch, ch2, ch3) // integer
        fmt.Printf("%c - %c - %c\n", ch, ch2, ch3) // character
        fmt.Printf("%X - %X - %X\n", ch, ch2, ch3) // UTF-8 bytes
        fmt.Printf("%U - %U - %U", ch, ch2, ch3)   // UTF-8 code point
        • 格式化说明符%c用于表示字符,当和字符配合使用时,%v%d会输出用于表示该字符的整数,%U输出格式为 U+hhhh 的字符串

        • Unicode 包中内置了一些用于测试字符的函数,这些函数的返回值都是一个布尔值,如下所示(其中 ch 代表字符):

          • 判断是否为字母:unicode.IsLetter(ch)

          • 判断是否为数字:unicode.IsDigit(ch)

          • 判断是否为空白符号:unicode.IsSpace(ch)

    • 类型 B 的值 = 类型 B(类型 A 的值)

      • valueOfTypeB = typeB(valueOfTypeA)

    • 指针(pointer)在Go语言中可以被拆分为两个核心概念:

      • 类型指针,允许对这个指针类型的数据进行修改,传递数据可以直接使用指针,而无须拷贝数据,类型指针不能进行偏移和运算。

      • 切片,由指向起始元素的原始指针、元素数量和容量组成

      • 每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go语言中使用在变量名前面添加&操作符(前缀)来获取变量的内存地址(取地址操作)

        • ptr := &v // v 的类型为 T

          • 其中 v 代表被取地址的变量,变量 v 的地址使用变量 ptr 进行接收,ptr 的类型为*T,称做 T 的指针类型,*代表指针

        • 量、指针和地址三者的关系是,每个变量都拥有地址,指针的值就是地址

        • 取地址操作符&和取值操作符*是一对互补操作符,&取出地址,*根据地址取出地址指向的值

        • 变量、指针地址、指针变量、取地址、取值的相互关系和特性如下:

          • 对变量进行取地址操作使用&操作符,可以获得这个变量的指针变量。

          • 指针变量的值是指针地址。

          • 对指针变量进行取值操作使用*操作符,可以获得指针变量指向的原变量的值。

        • Go语言还提供了另外一种方法来创建指针变量

          • new(类型)

        • 堆(heap):堆是用于存放进程执行中被动态分配的内存段。它的大小并不固定,可动态扩张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态加入到堆上(堆被扩张)。当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减);

        • 栈(stack):栈又称堆栈, 用来存放程序暂时创建的局部变量,也就是我们函数的大括号{ }中定义的局部变量。

        • 在Go语言中,你可以省略类型说明符 [type],因为编译器可以根据变量的值来推断其类型。

          • 显式类型定义: const b string = "abc"

          • 隐式类型定义: const b = "abc"

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

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

相关文章

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

出版实务 | 工具书

文章目录 字典、词典字典、词典的组织结构常用字典、词典介绍目前最常用、最通行的小型字典&#xff1a;《新华字典》常用的大型字典&#xff1a;《汉语大字典》最常用的中型词典&#xff1a;《现代汉语词典》常用的大型词典&#xff1a;《辞海》《辞源》《汉语大词典》 百科全…

机器学习笔记--图的基本表示和特征工程

斯坦福大学CS224W图机器学习笔记 学习参考 CS224W公开课:双语字幕 斯坦福CS224W《图机器学习》课程(2021) by Jure Leskove 官方课程主页:官方主页 子豪兄精讲:斯坦福CS224W图机器学习、图神经网络、知识图谱 同济子豪兄 子豪兄公开代码:同济子豪兄CS224W公开课 基于…

进程间通信-匿名管道

一 什么是通信 就是进程间的数据交换&#xff0c;进程间由于具有独立性&#xff0c;需要操作系统提供能让进程间交换信息&#xff0c;也就是数据的方法。 二 如何做到 让不同进程看到同一份资源(这不是很简单的事吗)&#xff0c;我在父进程定义一个变量&#xff0c;子进程不就…

庙算兵棋推演AI开发初探(2-编写策略(上))

开始研读step()函数的编写方法。 这个是图灵网提供了一些基础的ai代码下载&#xff08;浏览需要注册&#xff0c;下载需要审批&#xff09;。 AI开发中心-人机对抗智能 (ia.ac.cn)http://turingai.ia.ac.cn/ai_center/show 一、代码研读(BaseAgent类) 1.step函数 这段代码定…

丰田「退股」电装,传统汽车供应链体系走到十字路口

就在中国市场热衷于车企与零部件厂商的合纵连横之际&#xff0c;本周&#xff0c;传统汽车巨头丰田公司宣布&#xff0c;将出售部分电装&#xff08;Denso&#xff09;公司股份&#xff0c;资金用于投入电动化、智能驾驶等新技术研发。 按照计划&#xff0c;丰田汽车拟出售超过…

【PHP】ThinkPHP5的Db类进行CURD操作

在 ThinkPHP 5 中&#xff0c;可以使用 Db 类进行数据库的 CURD&#xff08;增删改查&#xff09; 以下是一些常用的 CURD 操作示例&#xff1a; 1.查询数据 // 查询一条数据 $result Db::table(table_name)->where(id, $id)->find();// 查询多条数据 $list Db::tab…

私有部署ELK,搭建自己的日志中心(二)-- filebeat的介绍与安装

一、背景 在搭建ELK系统之前&#xff0c;你有必要去了解下&#xff0c;为何大家在agent端普遍青睐filebeat&#xff0c;而把logstash放置于更加靠后端。 轻量级的filebeat&#xff0c;作为agent角色&#xff0c;是安装在每台虚拟机上。 filebeat的学习分为两大部分&#xff1…

【Java基础系列】body参数前后端不一致

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

cfa一级考生复习经验分享系列(十六)

写在前面&#xff1a;并不鼓励大家在考前一个月才开始复习&#xff0c;不过&#xff0c;既然已经逼到了绝境&#xff0c;灰心丧气也没有用&#xff0c;不如放手一搏&#xff01; 首先说一下我的背景&#xff0c;工作金融机构的it&#xff0c;和cfa基本没关系&#xff0c;本硕计…

【理论】STM32定时器时间计算公式 +【实践】TIM中断1s计时一次

前言&#xff1a;定时器TIM的详细知识点见我的博文&#xff1a;11.TIM定时中断-CSDN博客 STM32定时器时间计算公式 公式解释&#xff1a; ARR&#xff08;TIM_Period&#xff09;&#xff1a;自动重装载值&#xff0c;是定时器溢出前的计数值 PSC&#xff08;TIM_Prescaler&…

Docker自建文件快递柜系统

Docker自建文件快递柜系统。 软件特色&#xff1a; 轻量简洁&#xff1a;FastapiSqlite3Vue2ElementUI 轻松上传&#xff1a;复制粘贴&#xff0c;拖拽选择 多种类型&#xff1a;文本&#xff0c;文件 防止爆破&#xff1a;错误次数限制 防止滥用&#xff1a;IP限制上传次数…

掌握激活函数(一):深度学习的成功之源

文章目录 引言基本概念常用激活函数举例Sigmoid激活函数公式Sigmoid函数的数学特性示例基于NumPy和PyTorch实现Sigmoid函数将Sigmoid函数应用于二分类任务 Sigmoid激活函数的局限性举例 ReLU激活函数公式ReLU函数的数学特性ReLU函数的特点示例基于NumPy和PyTorch实现ReLU函数搭…

C++第1关:HelloWorld文件

任务描述 题目描述:向文件in.txt中写入字符串HelloWorld。 相关知识&#xff08;略&#xff09; 编程要求 根据提示&#xff0c;在右侧编辑器Begin-End处补充代码&#xff0c;完成本关要求。 测试说明 平台会对你编写的代码进行测试&#xff0c;若与预期输出一致&#xf…

【Java集合类不安全示例】

文章目录 一、List二、Set三、Map 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、List 代码如下&#xff08;示例&#xff09;&#xff1a; public class ZZZZZZZZZZ {public static void main(String[] args) {// ArrList 非线程安全的集合List&l…

软件测试/测试开发丨学习笔记之Python控制流-分支、循环

分支判断 什么是分支判断 一条一条语句顺序执行叫做顺序结构分支结构就是在某个判断条件后&#xff0c;选择一条分支去执行 1. IF if condition_1:statement_block_1 elif condition_2:statement_block_2 else:statement_block_32. if 嵌套 在嵌套 if 语句中&#xff0c;可…

文件过大放不了U盘?三个方法非常简单~

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题&#xff0c;可以借助一些工具把文件压缩后&#xff0c;体积变小后&#xff0c;再放入U盘&#xff0c;使得u盘得到高效的利用&#xff0c;下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…

数据结构学习 Leetcode474 一和零

关键词&#xff1a;动态规划 01背包 一个套路&#xff1a; 01背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要逆序遍历完全背包&#xff1a;空间优化之后dp【target1】&#xff0c;遍历的时候要正序遍历 目录 题目&#xff1a; 思路&#xff1a; 复杂…

BloombergGPT—金融领域大模型

文章目录 背景BloombergGPT数据集金融领域数据集通用数据集分词 模型模型结构模型相关参数训练配置训练过程 模型评估评估任务分布模型对比金融领域评估通用领域评估 背景 GPT-3的发布证明了训练非常大的自回归语言模型&#xff08;LLM&#xff09;的强大优势。GPT-3有1750亿个…

【vtkWidgetRepresentation】第十六期 vtkContourRepresentation(四)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享vtkContourRepresentation关联的Widget---vtkContourWidget的源码解析,希望对各位小伙伴有所帮助! vtkAbstractWidget中本以为没有什么特别需要注意的地方,就没有分享出来。通常Widget中的操作或参数…