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 := 30
    height := 175.5

    // 输出变量值
    fmt.Println("Name:", name)
    fmt.Println("Age:", age)
    fmt.Println("Height:", height)
}
  1. go 的变量交换语法糖
package main

import "fmt"

func main() {

	a := 'a'
	b := 'b'
	a, b = b, a
	fmt.Println(a, b)

}

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

4.2. 输入输出

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

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

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

package main

import "fmt"

func main() {
	var name string
	var age int
	fmt.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:
		statement1
	case case2:
		statement2
	default:
		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 main

import "fmt"

func main() {

	//数组声明
	var numbers [5]int

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

	numbers1 := new([5]int)
	numbers1[0] = 0

	//切片声明
	var slice []int
	slice1 := 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)


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《暮色将尽》跨越世纪的历程,慢慢走向并完善自我

《暮色将尽》跨越世纪的历程&#xff0c;慢慢走向并完善自我 戴安娜阿西尔&#xff08;1917-2019&#xff09;&#xff0c;英国知名文学编辑、作家。著有《暮色将尽》《昨日清晨》《未经删节》《长书当诉》等。 曾嵘 译 文章目录 《暮色将尽》跨越世纪的历程&#xff0c;慢慢走…

从零开始搭建SpringCloud Alibaba微服务架构

Spring Cloud Alibaba是Spring Cloud的一个拓展项目&#xff0c;它用于构建基于阿里巴巴的微服务应用。它提供了多个阿里巴巴的开源组件&#xff0c;如Nacos、Sentinel、Dubbo等&#xff0c;用于解决微服务架构中的服务注册、配置管理、流量控制等问题。 Spring Cloud Alibaba…

GPIO模拟spi时序点亮数码管

目录 spi.h spi.c main.c 实验效果 spi.h #ifndef __SPI_H__ #define __SPI_H__#include "stm32mp1xx_gpio.h" #include "stm32mp1xx_rcc.h"//spi初始化 void spi_init(); //spi写入数据 void spi_write(unsigned char data);#endif spi.c #include…

P2P服务端模型配合 Tool.net P2pServerAsync 类使用

Tool.Net 支持的 P2P 服务器模型实例 说明服务器部分相关代码相关调用实例Tcp版本Udp版本 最后附一张思维图 说明 当前文章&#xff0c;仅是Tool.Net 开源库的一个缩影。本次更新V5.0版本以上提供支持。可以提供简单实现P2P功能用于业务开发。 服务器部分相关代码 完整代码&…

SpringCloud微服务03-微服务保护-分布式事务-MQ基础-MQ高级

一、微服务保护 1.雪崩问题 如何做好后备方案就是后续&#xff1a; 2.雪崩解决方案 某一个服务的线程是固定的&#xff0c;出现故障线程占满后&#xff0c;就不会让取调用这个服务&#xff0c;对其他服务就没有影响。 3.Sentinel ①初识Sentinel 配置过程&#xff1a;day05-服…

核心四:线程的一生

4、核心四&#xff1a;线程的一生&#x1f49f; 4.1 New 已创建但还未启动的新线程。 我们new Thread之后&#xff0c;线程已经实现了一些准备工作。但没有运行run方法&#xff0c;因为没有使用start来开启线程。此时&#xff0c;线程处于New状态。 4.2 Runnable&#xff08…

element-ui的Form 表单有些项的参数校验

项目场景&#xff1a; 提示&#xff1a;项目相关背景&#xff1a; 项目场景&#xff1a;有时候自己的Form 表单中的某几项引入的一些项不好去校验 这样的咋去校验呢&#xff1f; 解决方案&#xff1a; 提示&#xff1a;问题的具体解决方案&#xff1a; 例如&#xff1a;写一…

将Surface的分辨率减半以省电(二合一本\笔记本电脑适用)

【完全自定义分辨率教程】这篇教程用于将Surface之类的高分屏&#xff08;高分辨率&#xff09;的二合一本或笔记本等的分辨率调整为原来的一半&#xff0c;以实现省电等目的。 下载CRU&#xff08;Custom Resolution Utility&#xff09;解压后&#xff0c;打开CRU.exe选择当…

【每日刷题】Day48

【每日刷题】Day48 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 872. 叶子相似的树 - 力扣&#xff08;LeetCode&#xff09; 2. 114. 二叉树展开为链表 - 力扣&…

每日一题《leetcode--382.链表随机结点》

https://leetcode.cn/problems/linked-list-random-node/ 这道题我们首先看到题目中的要求&#xff1a;在单链表中随机选取一个链表中的结点&#xff0c;要使每个结点被选取的概率是一样的。 当我们看到随机这两个字时&#xff0c;应该就会想起rand()这个函数。接着我们把使用这…

Rhinoceros v7.5 解锁版安装教程 (3D三维造型软件)

前言 Rhinoceros 中文名称犀牛是一款超强的三维建模工具&#xff0c;全称Rhinoceros&#xff0c;Rhino是美国Robert McNeel & Assoc开发的PC上强大的专业3D造型软件&#xff0c;它可以广泛地应用于三维动画制作、工业制造、科学研究以及机械设计等领域。它能轻易整合3DS M…

SpringFramework实战指南

二、SpringFramework实战指南 目录 一、技术体系结构 1.1 总体技术体系1.2 框架概念和理解 二、SpringFramework介绍 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 三、Spring IoC容器和核心概念 3.1 组件和组件管理概念3…

element-ui手机区号+手机号

需求场景 项目开发中对方要求手机号带上全球区号 需求分析 项目使用的是若依前端框架&#xff0c;element-ui的框架。尝试使用已经网上的组件vue-country-intl等发现不怎么适配element-ui的样式等。这还不是关键的&#xff0c;关键的是弹窗中使用这些组件发现区号的下拉展示框…

面试框架【面试准备】

前言 2023-9-12 12:12:04 2023-09-14 16:13:04 公开发布于 2024-5-22 00:16:21 以下内容源自《【面试准备】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平…

文件流下载优化:由表单提交方式修改为Ajax请求

如果想直接看怎么写的可以跳转到 解决方法 节&#xff01; 需求描述 目前我们系统导出文件时&#xff0c;都是通过表单提交后&#xff0c;接收文件流自动下载。但由于在表单提交时没有相关调用前和调用后的回调函数&#xff0c;所以我们存在的问题&#xff0c;假如导出数据需…

idea上传git命令

git init git remote add origin git add . git commit -m "标题" git push -u origin master

《Fundamentals of Power Electronics》——开关电源环路稳定性分析(中)

7.传递函数 传递函数&#xff0c;简单的理解就是输入和输出之间的关系。通过传递函数可以知道这个系统对不同频率信号响应&#xff0c;而这些响应通过画出传递函数的波特图又能知道传递函数在某点频率的相位和增益。一个系统要稳定可靠&#xff0c;那就需要一定的相位裕度和增…

基础3 探索JAVA图形编程桌面:逻辑图形组件实现

在一个宽敞明亮的培训教室里&#xff0c;阳光透过窗户柔和地洒在地上&#xff0c;教室里摆放着整齐的桌椅。卧龙站在讲台上&#xff0c;面带微笑&#xff0c;手里拿着激光笔&#xff0c;他的眼神中充满了热情和期待。他的声音清晰而洪亮&#xff0c;传遍了整个教室&#xff1a;…

【嵌入式芯片开发】不使用MicroLib的串口重定向万能预编译配置(适用于ARMCC、AC6等不同的编译器及版本)

【嵌入式芯片开发】不使用MicroLib的串口重定向万能预编译配置&#xff08;适用于ARMCC、AC6等不同的编译器及版本&#xff09; 文章目录 基本的串口重定向接收中断与scanf不能同时工作重定向卡死、低功耗一直唤醒 串口重定向万能预编译配置附录&#xff1a;Cortex-M架构的Sys…

2024042102-array-list

数组 Array 一、前言 数组是数据结构还是数据类型&#xff1f; 数组只是个名称&#xff0c;它可以描述一组操作&#xff0c;也可以命名这组操作。数组的数据操作&#xff0c;是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数据&#xff0c;而…