JAVA 转 Golang——速通 Golang 基础

文章目录

  • 1. 前言:
  • 2. go的下载与配置
  • 3. Golang 目录结构
  • 4. Golang 的基础语法
    • 4.1. 变量声明
    • 4.2. 输入输出
    • 4.3. 条件控制
    • 4.4. 数组和切片
    • 4.5. 映射表

1. 前言:

在这里插入图片描述

根据鼠鼠的实习投递经历,由于越来越多中大型公司都使用 Golang,在现在这个越来越内卷的后端就业环境下,学习一下 Golang 拓宽技术栈面是必须的,下面就跟着鼠鼠进行一些基础知识点的比较和学习吧。

2. go的下载与配置

配置思路与 JAVA 别无二致,这里我只写选择 x64 windows的最新版本(1.22.3 稳定版),我选择的是 zip 版的,需要自己配置环境变量的。
在这里插入图片描述

  1. 解压到一个目录里
    在这里插入图片描述
  2. 我喜欢把变量添加到用户变量里,把 安装的go目录的bin路径添加到系统变量即可。
    在这里插入图片描述
  3. 安装成功
    在这里插入图片描述

3. Golang 目录结构

Golang 主要有两种目录结构,Go mod模式(),Go PATH()模式

  1. Go Modules 是 Go 1.11 版本引入的一种新的包管理方式,旨在解决依赖管理和版本控制的问题。
  2. GOPATH 模式是旧版本 Go 中使用的一种包管理方式,它要求你将所有的 Go 项目都放在一个统一的工作空间(即 GOPATH)下

简单理解就是简单项目吧源代码放一起,通过路径引用依赖,复杂代码项目,通过mod文件管理依赖,类似与 Java 的 Maven。

在这里插入图片描述
main 方法作为 go 源代码执行的入口。通常在 package main 包下

在这里插入图片描述

go 语言编译不同于JAVA 编译成 JVM 字节码,而是将源代码编译成平台可识别的二进制码,因此体积更小,不需要其他环境支持

  1. go run = 编译 + 执行(需要 Go 环境支持)
  2. go build = 编译 (需要go 环境支持)
  3. 二进制码不需要go 环境支持,直接就可以运行,不过会丧失跨平台特性

在这里插入图片描述

4. Golang 的基础语法

go 的语法思路是基于c 语言的,但是加了很多语法糖,有着很多 JAVA 成熟语言的特性,也简化了 JAVA 的繁琐,思路和一众语言差不多。

😄 虽然 Golang 不排斥面向 var name:int = 1
对象,但是由于 Go 不像 JAVA 一样 结构体和方法一样有强关联,不建议面向对象编程

4.1. 变量声明

go的基本数据类型主要有

基本类型

  1. 布尔型 (bool):
  • 只能是 truefalse
var isActive bool = true
  1. 整型:
  • 不同大小和符号的整型(如 int8, int16, int32, int64, uint8, uint16, uint32, uint64)。
  • intuint 类型的大小依赖于执行程序的操作系统(32位或64位)。
  var age int = 30 var uAge uint = 30
  1. 浮点型:
  • float32, float64
  var temperature float64 = 36.6
  1. 复数类型:
  • complex64, complex128
  var complexNumber complex128 = complex(5, 7)
  1. 字符串 (string):
  • UTF-8 字符序列。
  var name string = "John Doe"
  1. 字节 (byte) 和符文 (rune):
  • byteuint8 的别名,用于处理原始数据。
  • runeint32 的别名,表示一个 Unicode 码点。
var b byte = 'a' var r rune = '你'
  1. go 的类型推断语法糖
func main() {// 使用 := 声明并初始化变量,编译器会根据初始化表达式的类型推断变量类型name := "Alice"age := 30height := 175.5// 输出变量值fmt.Println("Name:", name)fmt.Println("Age:", age)fmt.Println("Height:", height)
}
  1. go 的变量交换语法糖
package mainimport "fmt"func main() {a := 'a'b := 'b'a, b = b, afmt.Println(a, b)}

😄 妈妈再也不用担心不会写冒泡排序了!
在这里插入图片描述

4.2. 输入输出

go 的输入输出在逻辑和感觉上比 JAVA 更为统一

Java 的 常用的Scanner 和 System.out.println()给人一种很割裂的感觉。

go 通过 fmt 包的函数进行操作

package mainimport "fmt"func main() {var name stringvar age intfmt.Println("Enter your name and age:")fmt.Scanln(&name, &age)fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}

4.3. 条件控制

go的条件控制和 Java 类似 , 更自由一些,常用的 if 举例:

if condition1 {// 如果条件1为真,则执行这里的代码块
} else if condition2 {// 如果条件1为假且条件2为真,则执行这里的代码块
} else {// 如果以上条件都不满足,则执行这里的代码块
}if x := 5; x > 0 {fmt.Println("x is positive")
} else {fmt.Println("x is non-positive")
}

if 里可以进行变量声明

switch 也是常用的条件控制语句。

switch expr {case case1:statement1case case2:statement2default:default statement
}

4.4. 循环

go 的循环是我最喜欢的设计,尤其是在迭代的时候可以获取下标,要知道 Java 中使用迭代器迭代是无法获取下标的。

func main() {for i := 1; i <= 9; i++ {for j := 1; j <= 9; j++ {if i <= j {fmt.Printf("%d*%d = %2d  ", i, j, i*j)}}fmt.Println()}
}

这个可以配合可迭代对象使用,类似 Java 增强 for 循环,迭代器加强版,可以获取下标

func main() {sequence := "hello world"for index, value := range sequence {fmt.Println(index, value)}
}

4.4. 数组和切片

切片类似动态数组,由于 Java 中没用动态数组,一般使用 ArrayList 替代,但是数组和 List 使用方式不同,兼容性差,而切片使用方法和数组几乎相同,但是又可以自动扩容。

package mainimport "fmt"func main() {//数组声明var numbers [5]intnumbers = [5]int{1, 2, 3}numbers1 := new([5]int)numbers1[0] = 0//切片声明var slice []intslice1 := make([]int, 5, 5)fmt.Println(numbers[0], slice[0], slice1[0])
}

make函数接收三个参数:类型,长度,容量。举个例子解释一下长度与容量的区别,假设有一桶水,水并不是满的,桶的高度就是桶的容量,代表着总共能装多少高度的水,而桶中水的高度就是代表着长度,水的高度一定小于等于桶的高度,否则水就溢出来了。所以,切片的长度代表着切片中元素的个数,切片的容量代表着切片总共能装多少个元素,切片与数组最大的区别在于切片的容量会自动扩张

在这里插入图片描述

4.5. 映射表

go中的映射表和 Java 中的 hashMap 有点类似

mp := map[int]string{0: "a",1: "a",2: "a",3: "a",4: "a",
}mp := map[string]int{"a": 0,"b": 22,"c": 33,
}
//通过make 创建
mp := make(map[string]int, 8)mp := make(map[string][]int, 10)

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

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

相关文章

vue + SpringBoot + flowable 实现工作流审批功能 (流程图部署)

目录 搭建前端vue项目 vue init webpack project_name 初始化项目 导入 element-ui 框架 npm install element-ui -s 设置 element-ui 全局配置 编辑 main.js 文件 import ElementUI from "element-ui"; // ui框架导入 import element-ui/lib/theme-chal…

文心大模型4.0创建智能体:资深研发专家一对一辅导

目录 前言 一、什么是文心智能体平台&#xff1f; 1、通过平台能做什么 2、平台的优势 3、智能体类型 二、如何访问和使用这个智能体&#xff1f; 1、零代码开发&#xff1a;一句话创建智能体 2、资深研发专家一对一辅导智能体介绍 总结 前言 在当今快节奏和高度竞争的…

Sping源码(八)—registerBeanPostProcessors

序言 之前我们用大量的篇幅介绍过invokeBeanFactoryPostProcessors()方法的执行流程。 而invokeBeanFactoryPostProcessors的主要逻辑就是遍历执行实现了BeanDefinitionRegistryPostProcesso类(主要是针对BeanDefinition的操作)和BeanFactoryPostProcessor(主要针对BeanFacrot…

干货 | 什么是单相感应电机控制器?一文带你看感应交流电机解决方案KP86202

单相感应电机控制器是一种用于控制单相感应电机运行的电子设备。单相感应电机是一种常见的电动机类型&#xff0c;广泛应用于家用电器、商业设备以及轻工制造等领域。 单相感应电机控制器通常包括电源模块、控制逻辑模块和功率输出模块。其主要功能是对单相感应电机进行启停、…

如何生成Github Badge徽章图标

如何生成徽章Badge 什么是徽章(Badge)生成小徽章shields网站开源项目的徽章lib版本徽章代码测试覆盖度开源协议Github workflow的徽章 开源代码实践效果py-enumjs-enumerate 什么是徽章(Badge) 在开源项目的README中&#xff0c;经常会见到一些徽章(Badge)小图标&#xff0c;如…

FastCopy

目录 背景: 简介&#xff1a; 原理: 下载地址: 工具的使用: 背景: 简介&#xff1a; FastCopy是一款速度非常快的拷贝软件&#xff0c;软件版本为5.7.1 Fastcopy是日本的最快的文件拷贝工具&#xff0c;磁盘间相互拷贝文件是司空见惯的事情&#xff0c;通常情况…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题&#xff0c;即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制&#xff0c;在无中心的redis集群当中&#xff0c;其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

好书推荐|MATLAB科技绘图与数据分析

提升你的数据洞察力&#xff0c;用于精确绘图和分析的高级MATLAB技术 MATLAB科技绘图与数据分析——jd 本书内容 《MATLAB科技绘图与数据分析》结合作者多年的数据分析与科研绘图经验&#xff0c;详细讲解MATLAB在科技图表制作与数据分析中的使用方法与技巧。全书分为3部分&a…

C语言 数组——数组的定义和初始化

目录 为什么使用数组(Array)? 一维数组的定义 一维数组的初始化 一维数组元素的访问 一维数组元素的赋值 数组的逻辑存储结构 数组的物理存储结构 二维数组的定义和初始化 为什么使用数组(Array)? 一维数组的定义 一维 数组的定义 int a[10]; 定义一个有 10 个 int 型元素的…

构建传统企业信息化数字化智能化技术架构:挑战与机遇

随着数字化和智能化技术的快速发展&#xff0c;传统企业在信息化转型过程中面临着前所未有的机遇和挑战。如何构建适应企业需求的信息化数字化智能化技术架构&#xff0c;成为企业发展的关键之一。本文将探讨传统企业信息化数字化智能化技术架构的设计与实践。 一、数字化转型的…

【缺失的第一个正数】leetcode,python

真是越做越觉得自己所学尚浅&#xff0c;&#xff0c; 啊&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 直接上石山代码&#xff1a;&#xff08;过不了一点&#xff09;。。。。。 class Solution:def firstMissingPositive(self…

SpringBoot发送邮箱

一、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency> 二、添加配置 application.yml文件 将username修改为自己的邮箱&#xff0c;password修改为…

Linux基础入门和帮助-第二篇

马哥教育 Linux SRE 学习笔记 用户登录信息查看命令 whoami: 显示当前登录有效用户 [rootrocky8 ~]$whoami rootwho: 系统当前所有的登录会话 [rootrocky8 ~]$who root pts/0 2024-05-24 12:55 (10.0.0.1)w: 系统当前所有的登录会话及所做的操作 [rootrocky8 ~]…

WordPress 发布了独立的 SQLite 插件

之前 WordPress 在官方的 Performance Lab 插件实现 SQLite 模块&#xff0c;现在重构 SQLite 的实现&#xff0c;并且将其发布成一个独立的插件&#xff1a;SQLite Database Integration。 独立 SQLite 插件 最初的功能模块实现是基于 aaemnnosttv 的 wp-sqlite-db 插件修改实…

使用CyberRT写第一个代码, test ok

简介 计算框架是自动驾驶系统中的重中之重,也是整个系统得以高效稳定运行的基础。为了实时地完成感知、决策和执行,系统需要一系列的模块相互紧密配合,高效地执行任务流。由于各种原因,这些模块可能位于不同进程,也可能位于不同机器。这就要求计算框架中具有灵活的、高性…

谷歌蜘蛛池是什么?

或称为谷歌爬虫池&#xff0c;是一项专门针对谷歌搜索引擎优化&#xff08;SEO&#xff09;的先进技术&#xff0c;这种技术的主要目的是通过建立庞大的网站群体和复杂的链接结构来吸引和维持谷歌的爬虫程序的注意力&#xff0c;其核心是通过这种结构优化&#xff0c;增强特定网…

大学计算机专业三天看完《Python背记手册》全彩版,轻松学会 Python不迷路!

Python作为一门编程语言&#xff0c;Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。Python语法和动态类型&#xff0c;以及解释型语言的本质&#xff0c;使它成为多数平台上写脚本和快速开发应用的编程语言&#xff0c;随着版本的不断更新和语言新功…

Java | Leetcode Java题解之第109题有序链表转换二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution {ListNode globalHead;public TreeNode sortedListToBST(ListNode head) {globalHead head;int length getLength(head);return buildTree(0, length - 1);}public int getLength(ListNode head) {int ret 0;while (head…

【C语言】文件的编译链接和预处理

文件的编译链接和预处理 程序的翻译环境和执行环境翻译环境预处理&#xff08;预编译&#xff09;过程编译过程汇编过程链接过程 运行环境 预处理详解预处理符号预处理指令#define#define定义标识符#define定义宏#define替换规则 #与###的使用##的使用 带有副作用的宏参数宏与函…

超详细的前后端实战项目(Spring系列加上vue3)前端篇(二)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分 昨天完成了全局页面的代码&#xff0c;和登录页面的代码&#xff0c;不过昨天的代码还有一些需要补充的&#xff0c;这里添加一下 内容补充&#xff1a;在调用登…