Golang学习记录:基础知识篇(一)

news2024/11/29 20:59:41

Golang学习:基础知识篇(一)

  • 前言
  • 什么是Golang?
  • Go语言的基础语法
    • 语言结构
    • 基础语法
    • 数据类型
    • 基础使用

前言

很久之前就想学Go语言了,但是一直有其他东西要学,因为我学的是Java嘛,所以后面学的东西一直是跟Java相关的。

最近来到公司实习,需要用到Go语言,所以就趁着这个机会把Go学了。
在这里插入图片描述

什么是Golang?

简单来说就是由Google公司的Robert Griesemer,Rob Pike和Ken Thompson设计的一种静态类型、编译型语言。它在2009年正式对外公开,目标是解决大规模软件工程中的问题。Go语言的语法简洁清晰,易于学习和使用,编译速度快,具有垃圾回收功能,并且拥有强大的标准库。

Go语言的主要目标是将静态语言的安全性和高效性与动态语言的易开发性进行有机结合,达到完美平衡,从而使编程变得更加有乐趣,而不是在艰难抉择中痛苦前行。Go语言设计最本质的初衷就是简单,希望程序员的工作量最小化,利用Go本身少量的特性,并通过组合的方式去解决实际问题。

Go语言的基础语法

因为之前学过Java和C语言,所以我就主要记录一下他们之间的区别。

我是用的vscode作为代码编辑器。

语言结构

Go 语言的基础组成有以下几个部分:

  • 包声明
  • 引入包
  • 函数
  • 变量
  • 语句 & 表达式
  • 注释

接下来看下简单的代码,该代码输出了"Hello World!":

package main

import "fmt"

func main() {
   /* 这是我的第一个简单的程序 */
   fmt.Println("Hello, World!")
}

有点C语言的感觉有木有……

  • 第一行代码 package main 定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包。
  • import就是导包
  • func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。

基础语法

其实也和C语言差不多,和C语言不一样的有以下几个地方:

1、在 Go 程序中,一行代表一个语句结束。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成。

如果你打算将多个语句写在同一行,它们则必须使用 ; 人为区分,但在实际开发中我们并不鼓励这种做法。

go语言保留的关键字有:
在这里插入图片描述
2、此外,在 Go 语言中,空格通常用于分隔标识符、关键字、运算符和表达式,以提高代码的可读性。

Go 语言中变量的声明必须使用空格隔开,如:

var x int
const Pi float64 = 3.14159265358979323846

这是因为在运算符和操作数之间要使用空格能让程序更易阅读。我平时敲代码没有敲空格的习惯,但是每次保存后,他竟然会自动给我把该有的空格给打上去了,很神奇。可能是我装了什么插件?

对了,在go语言中IF表达式不用括号,我一开始不知道,后面因为我那个神奇的插件,每次我保存之后,他会默认给我把括号给干了,就像这样。

if x > 0 {
    // do something
}

3、go语言的类型定义一般写在语句的最后面,举个例子:

//在C语言中,我们定义一个整型变量
int x ;
float pi = 3.14159265358979323846;


//而在go语言中,通常这样写
var x int
const Pi float64 = 3.14159265358979323846

//之后还会接触更简单的写法,像这样:
 pi := 3.14159265358979323846

那么为什么go语言要把数据定义放在后面,而不是像Java一样,放在变量前面嘞?

因为数据类型放在变量名后面可以增加代码的可读性和可维护性。这种语法风格称为“后缀类型声明”。使用后缀类型声明,可以清晰地指定变量的数据类型,避免了在代码中使用多个变量时,由于数据类型不同而产生的混淆和错误。

此外,Go语言的这种设计还有另一个重要的原因:Go语言支持类型推断,也就是说,在许多情况下,你可以省略变量的类型,让Go语言自动推断。这样做可以使代码更简洁,也更符合人类的阅读习惯。

例如,在Go语言中,你可以写 var a = 20 。因为20是一个整数,所以Go语言可以自动推断出 a 的类型是 int。如果把类型放在变量名前面,那么当你想省略类型时,变量名就必须放在等号的右边,这样就打破了我们通常的阅读习惯。

总的来说,Go语言把类型放在变量名后面,主要是为了提高代码的可读性、可维护性和简洁性。

数据类型

数据类型蛮多的,详情点击这里:Go语言数据类型

问:为什么Go语言会有这么多数据类型嘞?比如 float 都分了一个“ float32 ”和“ float64 ”

这是因为Go语言的数据类型设计理念主要是为了提供更多的灵活性和效率。数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存。

Go语言提供了多种多样的数据类型,这些数据类型可以满足各种编程需求,使得Go语言在处理复杂的数据结构时更加方便和高效。

此外,Go语言还提供了基于架构的类型,例如:intuintuintptr。这些类型的大小会根据运行程序的操作系统位数来确定,这样可以更好地利用硬件资源,提高程序运行效率。

相比之下,Java语言的数据类型设计相对简单一些,主要包括八种基本数据类型和引用数据类型。这是因为Java语言的设计目标是“ 一次编写,到处运行 ”,因此它在数据类型设计上追求的是跨平台性和易用性。

总的来说,Go语言在数据类型设计上提供了更多的选择和灵活性,以适应各种不同的编程需求和场景。

问:比如我写了一句a, b, c, d := 20, 10, 15, 5 ,他会默认用int8还是int16其他类型?为什么嘞

答:在Go语言中,当你使用 := 进行变量声明和初始化时,Go会根据右侧的值自动推断出变量的类型。例如,代码 a, b, c, d := 20, 10, 15, 5 中,因为20、10、15和5都是整数,所以Go会自动推断 abcd 的类型为 int

这是因为Go语言的设计目标之一是代码的简洁性和易读性。通过自动类型推断,程序员可以省去在每次声明变量时都显式指定变量类型的麻烦,使得代码更加简洁易读¹。

至于为什么默认使用 int 而不是 int8int16,这是因为在大多数情况下,int 类型已经足够满足需求,并且可以提供更好的性能。在Go语言中,int 类型的大小会根据运行程序的操作系统位数来确定。这样可以更好地利用硬件资源,提高程序运行效率。

如果你需要使用特定大小的整数类型(如 int8int16),你可以在声明变量时显式指定类型。例如:var e int8 = 20。这样,变量 e 的类型就会被明确地设置为 int8

基础使用

简单总结一下这两天的使用体验:

  • IF…Else 语句: 和Java差不多,条件表达式没有括号;举个栗子:
	// if, if else, else 语句
    a := 10
    if a == 10 {
        fmt.Println("a 等于 10")
    } else if a > 10 {
        fmt.Println("a 大于 10")
    } else {
        fmt.Println("a 小于 10")
    }
  • For 循环语句: 和Java差不多,条件表达式没有括号;举个栗子:
	// for 循环
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
  • 运算符:基本一致,还没发现哪里不一样。如果后续发现了,再来补充修改
  • 自定义函数: 和Java完全不一样,类型写在后面,返回类型写在最后面;举个栗子:
/* 函数返回两个数的最大值 */
func max(num1, num2 int) int {
   /* 声明局部变量 */
   var result int

   if (num1 > num2) {
      result = num1
   } else {
      result = num2
   }
   return result 
}
  • 变量作用域: 和C语言一个样;局部变量写函数里面,全局变量拎出来;举个例子:
package main

import "fmt"

/* 声明全局变量 */
var g int

func main() {

   /* 声明局部变量 */
   var a, b int

   /* 初始化参数 */
   a = 10
   b = 20
   g = a + b

   fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
}
  • 数组:语法格式如下:
var arrayName [size]dataType

其中,arrayName 是数组的名称,size 是数组的大小,dataType 是数组中元素的数据类型。

数组初始化
以下实例声明一个名为 numbers 的整数数组,其大小为 5,在声明时,数组中的每个元素都会根据其数据类型进行默认初始化,对于整数类型,初始值为 0。

var numbers [5]int

还可以使用初始化列表来初始化数组的元素:

var numbers = [5]int{1, 2, 3, 4, 5}

另外,还可以使用 := 简短声明语法来声明和初始化数组:

numbers := [5]int{1, 2, 3, 4, 5}

以上代码创建一个名为 numbers 的整数数组,并将其大小设置为 5,并初始化元素的值。

注意!如果数组长度不确定,可以使用 … 代替数组的长度,编译器会根据元素个数自行推断数组的长度:

var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
或
balance := [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

如果设置了数组的长度,我们还可以通过指定下标来初始化元素:

//  将索引为 13 的元素初始化
balance := [5]float32{1:2.0,3:7.0}

访问数组元素没啥好说的,一维数组理解了,多维数组和函数传递数组也差不多了,传送门:Go语言多维数组,向函数传递数组

指针、结构体的定义就像之前变量的定义,然后用法和C语言基本一致,举两个栗子:

指针:

package main

import "fmt"

func main() {
   var a int= 20   /* 声明实际变量 */
   var ip *int        /* 声明指针变量 */

   ip = &a  /* 指针变量的存储地址 */

   fmt.Printf("a 变量的地址是: %x\n", &a  )

   /* 指针变量的存储地址 */
   fmt.Printf("ip 变量储存的指针地址: %x\n", ip )

   /* 使用指针访问值 */
   fmt.Printf("*ip 变量的值: %d\n", *ip )
}

结构体:

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}


func main() {

    // 创建一个新的结构体
    fmt.Println(Books{"Go 语言", "www.runoob.com", "Go 语言教程", 6495407})

    // 也可以使用 key => value 格式
    fmt.Println(Books{title: "Go 语言", author: "www.runoob.com", subject: "Go 语言教程", book_id: 6495407})

    // 忽略的字段为 0 或 空
   fmt.Println(Books{title: "Go 语言", author: "www.runoob.com"})
}

这些就是一些比较基础的语法了,在学习的过程中,可以多去敲敲代码,熟悉一下。也可以去菜鸟教程上面多看看,对新人挺友好的,也是我的公司同事推荐的。后续会不定期更新学习记录和一些学习实验吧

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

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

相关文章

配置VScode开发环境-CUDA编程

如果觉得本篇文章对您的学习起到帮助作用&#xff0c;请 点赞 关注 评论 &#xff0c;留下您的足迹&#x1f4aa;&#x1f4aa;&#x1f4aa; 本文主要介绍VScode下的CUDA编程配置&#xff0c;因此记录以备日后查看&#xff0c;同时&#xff0c;如果能够帮助到更多人&#xf…

操作系统导论-第四章作业(待更)

一、进程 进程就是运行中的程序&#xff0c;程序本身是没有生命周期的&#xff0c;它只是存储在磁盘上的一些指令&#xff08;或者一些静态数据&#xff09;&#xff0c;操作系统将这些指令和数据加载到内存中&#xff0c;使其运行起来。 1.1 虚拟化CPU技术 根据我们平时使用…

基于Java的共享充电宝管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

AI时代助力程序员与项目经理的双翼飞翔:从开发到成长的秘诀

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

企业网盘中支持在线编辑的有哪些选项?

企业网盘作为现代企业不可或缺的工具之一&#xff0c;为企业提供了便捷的文件存储和共享功能。而其中支持在线编辑的解决方案更是减少了对额外软件的依赖&#xff0c;使团队成员可以直接在浏览器中进行实时协作。 什么是在线编辑&#xff1f; 在线编辑是指用户无需下载文件&a…

3D 生成重建008-zero123让扩散模型了解空间信息zero-shot 单图生3d

3D 生成重建008-zero123让扩散模型了解空间信息zero-shot 单图生3d 文章目录 00 论文工作1 论文方法1.1 条件生成微调1.2 维护3d表示 2 效果 0 0 论文工作 之前分享的工作主要尝试是从一个pre-trained 文生图的diffusion模型中去蒸馏知识&#xff0c;从而去维护一个3d的表示…

数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

文章目录 栈和队列上机实验1.要求2.栈的实现&#xff08;以顺序栈为例&#xff09;3.队列的实现&#xff08;以顺序队列为例&#xff09;4.利用栈实现进制转换5.利用队列解决约瑟夫环问题6.全部源码Stack.hQueue.htest.cpp 栈和队列上机实验 1.要求 1.利用栈的基本操作实现将任…

docker-compose部署elk(8.9.0)并开启ssl认证

docker部署elk并开启ssl认证 docker-compose部署elk部署所需yml文件 —— docker-compose-elk.yml部署配置elasticsearch和kibana并开启ssl配置基础数据认证配置elasticsearch和kibana开启https访问 配置logstash创建springboot项目进行测试kibana创建视图&#xff0c;查询日志…

李宏毅生成式AI课程笔记(持续更新

01 ChatGPT在做的事情 02 预训练&#xff08;Pre-train&#xff09; ChatGPT G-Generative P-Pre-trained T-Transformer GPT3 ----> InstructGPT&#xff08;经过预训练的GPT3&#xff09; 生成式学习的两种策略 我们在使用ChatGPT的时候会注意到&#xff0c;网站上…

2023/10/15

文章目录 1.uniapp之Vue2升Vue3值得注意的几点1.1 页面生命周期的使用1.2 引入资源的方式 2. 浏览器本地存储之Cookie和webStorage3. CSS变量 var()的用法4. CSS之实现线性渐变背景5. 图片无法和文字对齐的正确解决方案6. 使用正则处理接口返回的富文本内的图片7. transition实…

Java练习题-获取数组元素最大值

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…

[cpp primer随笔] 11. 内联函数与constexpr函数

1. 内联函数 调用函数一般比对等价表达式求值要慢。因为调用函数除了对表达式求值外&#xff0c;还包含一系列过程&#xff0c;包括堆栈建立、拷贝实参、跳转执行等等。而在程序之中&#xff0c;通常存在一些优化规模较小、流程直接、却调用频率很高的函数&#xff0c;我们可以…

51系列—基于51单片机的集中抄表设计(代码+文档资料)

概述 自动抄表&#xff08;Automatic Meter Reading-AMR&#xff09;是指采用通讯和计算机网络等技术自动读取和处理表计数据。发展电能自动抄表技术是提高用电管理水平的需要&#xff0c;也是网络和计算机技术迅速发展的必然。在用电管理方面&#xff0c;采用自动抄表技术&am…

YOLOv5-QAT量化部署

目录 前言一、QAT量化浅析二、YOLOv5模型训练1. 项目的克隆和必要的环境依赖1.1 项目克隆1.2 项目代码结构整体介绍1.3 环境安装 2. 数据集和预训练权重的准备2.1 数据集2.2 预训练权重准备 3. 训练模型3.1 修改数据配置文件3.2 修改模型配置文件3.3 训练模型3.4 mAP测试 三、Y…

浅谈“智慧园区”

前言&#xff1a;国庆《中国智慧园区发展白皮书&#xff08;2022&#xff09;》&#xff0c;很全面的介绍智慧园区的起源、发展阶段、涉及内容、未来规划、竞争格局等。做了些笔记&#xff0c;这对在智慧园区工作的伙伴应该很有帮助&#xff0c;下面是笔记和一些公开资料的整合…

小谈设计模式(30)—Java设计模式总结

小谈设计模式&#xff08;30&#xff09;—Java设计模式总结 专栏介绍专栏地址专栏介绍 总括三个主要类别abc 创建型模式&#xff08;Creational Patterns&#xff09;常见的创建型模式单例模式&#xff08;Singleton Pattern&#xff09;工厂模式&#xff08;Factory Pattern&…

【计算机网络笔记】分组交换中的报文交付时间计算例题

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 系列文章目录题目解答 题目 在下图所示的采用“存储-转发”方式的分组交换网络中所有链路的数据传输速率为100 Mbps&#xff0c;分…

[开源]基于Vue+ElementUI+G2Plot+Echarts的仪表盘设计器

一、开源项目简介 基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的仪表盘设计器&#xff0c;具备仪表盘目录管理、仪表盘设计、仪表盘预览能力&#xff0c;支持MySQL、Oracle、PostgreSQL、MSSQL、JSON等数据集接入&#xff0c;对于复杂数据处理还可以使用…

【具身智能模型1】PaLM-E: An Embodied Multimodal Language Model

论文标题&#xff1a;PaLM-E: An Embodied Multimodal Language Model 论文作者&#xff1a;Danny Driess, Fei Xia, Mehdi S. M. Sajjadi, Corey Lynch, Aakanksha Chowdhery, Brian Ichter, Ayzaan Wahid, Jonathan Tompson, Quan Vuong, Tianhe Yu, Wenlong Huang, Yevgen C…

Trello的替代方案有哪些?6种国内外选择!

Trello是一个功能强大的项目管理工具&#xff0c;可以帮助团队组织和跟踪他们的工作。然而它并不是唯一的工具。Trello有很多替代方案&#xff0c;它们提供了独特的功能和不同的方法来管理任务和项目。以下是Trello的一些优秀替代方案&#xff1a;Zoho Projects、Basecamp、Wri…