慢聊Go之GoVSJava之微观比较(7)|Go主题月

简介: 慢聊Go之GoVSJava之微观比较(7)|Go主题月

前言

休息了两天,学习的脚步虽然没有停下,但是都在忙其他事情了。没有按照时间进度紧张的更新文章。今天,不在等待,我来了。继续Javaer人员转型Goer的学习。

进度条一直在走,我们之前调研了,很多Go与Java的对比信息。那么今天,我们就一些两者之间非常重要的概念,做一些对比学习。

那些年我们忘掉的指针

还记得,我们作为专业编程学习者,可能很早时候,入门是一门C语言。无数次,被指针折磨的死去活来,难受不堪。那么,正如我们之前聊得,Go的诞生背景,就是为了让C语言的开发更加简单,而易维护。那么,Go仍然延伸了C语言中指针的概念。其实不难,不要害怕,听我娓娓道来。

首先确认,Go中有指针的概念,Java中没有指针的概念。

指针的含义:简单的来说,就是存储一个变量地址变量

Go中使用指针的方法很简单: *+变量类型 = 对应变量类型的指针类型,&+变量名 = 获取变量引用地址

var  指针变量名 *指针变量类型 = &变量名

例如: var my_point *int = &num 通过&+指针变量 = 修改原来的变量真实值 &指针变量名 = 修改的变量值 例如: &my_point = 100;

总结

*作用

定义指针类型

获取指针地址代表的值

&作用

获取变量的指针地址

示例:

package main
import "fmt"
func main() {
  // 声明实际变量
  var name string="li_ming"
  // 声明指针变量
  var name_point *string
  // 指针变量的存储地址
  name_point = &name
  //直接访问变量地址
  fmt.Println("name 变量的地址是:", &name  )
  // 指针变量的存储地址
  fmt.Println("name_point变量储存的指针地址:", name_point )
  // 使用指针访问值
  fmt.Println("*name_point 变量的值:", *name_point )
}

输出结果:

name 变量的地址是: 0x10ae40f0
name_point变量储存的指针地址: 0x10ae40f0
*name_point 变量的值: li_ming

Go语言的中new,make和Java中的new对象有什么区别?

首先,Java中的new关键字代表创建关于某一个类的一个新的对象。

如:

List list = new ArrayList(); 

Go中的创建一个struct结构体的对象,是不需要用new关键字的

Go中new的概念是和内存相关的,我们可以通过new来为基础数据类型申请一块内存地址空间,然后把这个把这个内存地址空间赋值给一个指针变量上。(new主要就是为基础数据类型申请内存空间的,当我们需要一个基础数据类型的指针变量,并且在初始化这个基础指针变量时,不能确定他的初始值,此时我们才需要用new去内存中申请一块空间,并把这空间绑定到对应的指针上,之后可以用该指针为这块内存空间写值。new关键字在实际开发中很少使用,和java很多处用new的情况大不相同)

参考如下示例代码:

package main
import "fmt"
func main() {
   var num *int
   //此处num是nil
   fmt.Println(num)
   //此处会报空指针异常,因为num为nil,没有申请内存空间,所以不能为nil赋值
   *num = 1
   fmt.Println(*num)
}

改为如下代码即可:

package main
import "fmt"
func main() {
   //在内存中申请一块地址,并把内存地址存入num
   var num = new(int)
   //此处num的值是申请出来的内存空间地址值,一个十六进制的数字
   fmt.Println(num)
   //正常
   *num = 1
   fmt.Println(*num)
}

接下来我们来看一个go中的make是做什么用的?

go中的make是用来创建slice(切片),map(映射表),chan(线程通信管道)这三个类型的对象的,返回的就是对应类型的对象,作用就相当于Java中new一个ArrayList,new一个HashMap时候的new的作用,只不过是go语法规定用make来创建slice(切片),map(映射表),chan(线程通信管道)。

示例代码如下:

package main
import "fmt"
func main() {
   //make只能为map,channel,slice申请分配内存,只有这三种,没有第四种
   //所有通过make创建的这三种类型都是引用类型,传递参数时虽然是引用值传递,
   //但是对方法内引用变量参数的修改可以影响到外部的引用变量
   //1.通过make创建map对象  如下代码类似于Java中 Map<String,Integer> myMap = new HashMap<>();
   //在这里make就是申请分配map的内存,和java中创建map的new一样
   myMap := make(map[string]int)
   myMap["li_ming"] = 20
   //2.通过make创建channel,make函数内可以有一个参数,也可以有两个参数,有两个参数时第二个参数
   //为通道的缓存队列的长度
   //2.1) 只有一个参数,通道的缓存队列长度此时为0,也就是无缓存。
   //创建一个传输int类型数据的通道
   myChan := make(chan int)
   fmt.Println(myChan)
   //2.2) 有两个参数,第二个参数2代表此时代表缓存队列的长度为2
   //创建一个传输int类型数据的通道,缓存为2
   mychan2 := make(chan int,2)
   fmt.Println(mychan2)
   //此处暂时不做通道缓存队列数多少有何区别的讲解
   //3.通过make创建slice切片
   //有两种方式,一种是两个参数,一种是三个参数
   //我们只有在创建一个空的切片时才会使用make
   //如果通过一个已有的数组创建切片往往是下面的形式
   //创建一个底层数组
   myArr := []int{1,2,3,4,5}
   //如果通过一个数组创建切片,往往是用 原始数组变量名[切片起始位置:切片结束位置] 创建一个切片
   mySlice1 := myArr[2:4]
   fmt.Println(mySlice1)
   //我们如果是想创建一个空的slice,则用make创建切片
   //如下形式 make(int[],num1,num2)
   //num1 = 切片的长度(默认分配内存空间的元素个数)
   //num2 = 切片的容量(解释:底层数组的长度/切片的容量,超过底层数组长度append新元素时会创建一个新的底层数组,
   //不超过则会使用原来的底层数组)
   //代表底层数组的长度是4,默认给底层数组的前两个元素分配内存空间
   //切片指向前两个元素的地址,如果append新元素,在元素数小于4时都会
   //在原来的底层数组的最后一个元素新分配空间和赋值,
   //append超过4个元素时,因为原数组大小不可变,也也存储不下了,
   //所以会新创建一个新的底层数组,切片指向新的底层数组
   mySliceEmpty := make([]int,2,4)
   fmt.Println(mySliceEmpty)
   //两个参数,代表切片的长度和切片的容量(底层数组长度)均为第二个参数那个值
   mySliceEmpty2 := make([]int,5)
   fmt.Println(mySliceEmpty2)
}

总结

一切都刚刚开始,一切都是新的。

学习的道路是一马平川的,为了更好的进步,我们加油就好!!

好好理解,今天的内容,这些理解了,对于转型来说,是一个非常大的进步。


目录
相关文章
|
10月前
|
存储 JSON Go
|
10月前
|
存储 安全 编译器
|
10月前
|
移动开发 算法 编译器
OAUTH之钉钉第三方授权 | GO主题月
hello,我是小魔童哪吒,欢迎点击关注,有更新,将第一时间呈现到你的面前 胖sir:小魔童,我今天收到了一个需求,期望我们做一个第三方登录的功能,用户可以通过第三方授权来登录我们的web
262 0
|
10月前
|
Go Cloud Native
为什么要写技术文章 | GO主题月
这个问题对于每一个人来说各有各的原因。有的为了写作变现,有的为了自己的兴趣,写小说,写文章,写书。
为什么要写技术文章 | GO主题月
|
10月前
|
网络安全 Go Cloud Native
SSH连接服务器后执行多条命令 |Go主题月
大家平时有没有遇到自己连接云服务器,ssh 连接上去之后,发现自己的一些小工具用不了 例如go build无法使用 ,由于我们安装配置golang 环境的时候,是在文件/etc/profile中写了配置,因此需要source 一下/etc/profile
120 0
SSH连接服务器后执行多条命令 |Go主题月
|
10月前
|
Linux Go Windows
|
10月前
|
Go Windows Cloud Native
5个步骤搞定protoc环境安装 | GO主题月
[TOC] 胖sir:不知道你有没有这样的疑惑,工作中发现很多新接触GO的小伙伴安装protoc的环境需要折腾很久,刚才开我装环境的时候也是花了好长时间,最后如何装好的也不知原因,网上查找了各种资源,也没有一篇文章可以很好的解决这个问题.
1544 0
|
1天前
|
消息中间件 Go API
Golang深入浅出之-Go语言中的微服务架构设计与实践
【5月更文挑战第4天】本文探讨了Go语言在微服务架构中的应用,强调了单一职责、标准化API、服务自治和容错设计等原则。同时,指出了过度拆分、服务通信复杂性、数据一致性和部署复杂性等常见问题,并提出了DDD拆分、使用成熟框架、事件驱动和配置管理与CI/CD的解决方案。文中还提供了使用Gin构建HTTP服务和gRPC进行服务间通信的示例。
9 0
|
1天前
|
Prometheus 监控 Cloud Native
Golang深入浅出之-Go语言中的分布式追踪与监控系统集成
【5月更文挑战第4天】本文探讨了Go语言中分布式追踪与监控的重要性,包括追踪的三个核心组件和监控系统集成。常见问题有追踪数据丢失、性能开销和监控指标不当。解决策略涉及使用OpenTracing或OpenTelemetry协议、采样策略以及聚焦关键指标。文中提供了OpenTelemetry和Prometheus的Go代码示例,强调全面可观测性对微服务架构的意义,并提示选择合适工具和策略以确保系统稳定高效。
12 5
|
1天前
|
监控 算法 Go
Golang深入浅出之-Go语言中的服务熔断、降级与限流策略
【5月更文挑战第4天】本文探讨了分布式系统中保障稳定性的重要策略:服务熔断、降级和限流。服务熔断通过快速失败和暂停故障服务调用来保护系统;服务降级在压力大时提供有限功能以保持整体可用性;限流控制访问频率,防止过载。文中列举了常见问题、解决方案,并提供了Go语言实现示例。合理应用这些策略能增强系统韧性和可用性。
12 0