Golang与Java各方面使用对比(下)

golang中使用泛型 golang支持泛型函数和泛型类型。//泛型函数}[Tany]为类型约束,any表示任意类型,(argsT)为参数。如果只想支持特定的几个类型可以这样写。}如果类型太多了,可以这样表示}}有时候需要类型可以进行算数运算,但是any中有些类型又是不支持的,因此需要用到编译器内置的约束comparable,该类型必须支持==方法。}如果使用了自定义的类型}如果只想支持一个类型,那就不需要使用泛型了。最终改造为}else{}}多个参数多个类型}指的是复合类型,它包含了泛型。... 阅读详情

其实两年前就接触过Golang,但是当时对Golang的理解仅停留在“基本语法”这一块,没有去比较Golang相对于Java的其他差异,后续也因为使用Java作为主力语言而没有再使用过Golang了。现在从几个角度来和Java进行对比,以便更好地使用及理解Golang,希望本文能对刚入门Golang的朋友有所帮助。如有其他疏漏或错误也望大家不吝赐教。

Golang基本的使用可以参考我之前写的笔记:《Golang核心知识总结》

本文是Golang与Java对比的第二篇,主要对比Golang与Java在面向对象、异常处理、并发编程及垃圾回收方面的差异。

第一篇文章传送门:Golang与Java各方面使用对比(上)

在这里插入图片描述

一、面向对象

1.1、与Java面向对象的区别

Golang是一门具备面向对象编程风格的语言,但是却不具备Java等传统面向对象语言中“继承(extends)、实现(implements)”的关键字。

在Golang中,通过接口或结构体的组合来实现非严格的“继承”,通过非侵入式的接口来实现非严格的“多态”,通过结构体及包和函数实现了代码细节的“封装”,有了封装、继承与多态,就可以很好地通过OO思维实现与现实需求所对应的程序了。

1.2、结构体组合

假设有这么一个场景:动物(Animal)具备名字(Name)、年龄(Age)的基本特性,现在需要实现一个Dog类型,且Dog类型需要具备Animal所需的所有特性,并且自身具备犬吠(bark())的方法,使用Java和Golang来实现该场景会有什么区别呢?

首先来看看最熟悉的Java要如何写,很简单,使用抽象类描述Animal作为所有动物的超类,Dog extends Animal:

  • Java
public abstract class Animal {
    protected String name;
    protected int age;
}

public class Dog extends Animal {
    public void bark() {
        System.out.println(age + "岁的" + name + "在汪汪汪...");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.name = "tom";
        dog.age = 2;
        dog.bark(); // 2岁的tom在汪汪汪...
    }
}

在Golang中,可以这样通过结构体的组合来实现继承:

  • Golang
package oom

type Animal struct {
	Name string
	Age int
}

type Dog struct {
	*Animal
}

func (d *Dog) Bark() {
	fmt.Printf("%d岁的%s在汪汪汪...", d.Age, d.Name)
}

// ----------
package main

func main() {
	dog := &oom.Dog{&oom.Animal{
		Name: "tom",
		Age:  2,
	}}
	dog.Bark() // 2岁的tom在汪汪汪...
}

Golang使用了非侵入式接口来实现“多态”。

1.3、非侵入式接口

Go语言的接口并不是其他语言(C++、Java、C#等)中所提供的接口概念。
在Go语言出现之前,接口主要作为不同组件之间的契约存在。对契约的实现是强制的,你必须声明你的确实现了该接口。为了实现一个接口,你需要从该接口继承:

interface IFoo {
    void Bar();
}

class Foo implements IFoo { // Java文法
// ...
}

class Foo : public IFoo { // C++文法
// ...
}

IFoo foo = new Foo;

这类接口我们称为侵入式接口。“侵入式”的主要表现在于实现类需要明确声明自己实现了某个接口。这种强制性的接口继承是面向对象编程思想发展过程中一个遭受相当多置疑的特性。

Golang的非侵入式接口不需要通过任何关键字声明类型与接口之间的实现关系,只要一个类型实现了接口的所有方法,那么这个类型就是这个接口的实现类型。

假设现在有一个Factory接口,该接口中定义了Produce()方法及Consume()方法,CafeFactory结构体作为其实现类型,那么可以通过以下代码实现:

package oom

type Factory interface {
	Produce() bool
	Consume() bool
}

type CafeFactory struct {
	ProductName string
}

func (c *CafeFactory) Produce() bool {
	fmt.Printf("CafeFactory生产%s成功", c.ProductName)
	return true
}

func (c *CafeFactory) Consume() bool {
	fmt.Printf("CafeFactory消费%s成功", c.ProductName)
	return true
}

// --------------
package main

func main() {
	factory := &oom.CafeFactory{"Cafe"}
	doProduce(factory)
	doConsume(factory)
}


func doProduce(factory oom.Factory) bool {
	return factory.Produce()
}

func doConsume(factory oom.Factory) bool {
	return factory.Consume()
}

可以看到,只要CafeFactory实现了所有的Factory方法,那么它就是一个Factory了,而不需要使用implements关键字去显式声明它们之间的实现关系。

Golang的非侵入式接口有许多好处:

1.在Go中,类型的继承树并无意义,我们只需要知道这个类型实现了哪些方法,每个方法是啥含义就足够了

2.实现类型的时候,只需要关心自己应该提供哪些方法,不用再纠结接口需要拆得多细才合理。接口由使用方按需定义,而不用事前规划

3.不用为了实现一个接口而导入一个包,因为多引用一个外部的包,就意味着更多的耦合。接口由使用方按自身需求来定义,使用方无需关心是否有其他模块定义过类似的接口

一句话总结非侵入式接口的好处就是简单、高效、按需实现。

1.4、interface{}空接口

interface{} 空接口是任意类型的接口,所有的类型都是空接口的实现类型。因为Golang对于实现类型的要求是实现了接口的所有方法,而空接口不存在方法,所以任意类型都可以充当空接口。

以下是一个使用空接口充当参数的类型判断例子:

func getType(key interface{}) string {
	switch key.(type) {
		case int:
			return "this is a integer"
		case string:
			return "this is a string"
		default:
			return "unknown"
	}
}

二、异常处理

2.1、与Java异常处理的区别

在Java中通过try..catch..finally的方式进行异常处理,有可能出现异常的代码会被try块给包裹起来,在catch中捕获相关的异常并进行处理,最后通过finally块来统一执行最后的结束操作(释放资源、释放锁)。

而Golang中的异常处理(更贴切地说是错误处理)方式比Java的简单太多,所有可能出现异常的方法或者代码直接把错误当作第二个响应值进行返回,程序中对返回值进行判断,非空则进行处理并且立即中断程序的执行,避免错误的传播。

value, err := func(param)

if err != nil {
    // 返回了异常,进行处理
    fmt.Printf("Error %s in pack1.Func1 with parameter %v", err.Error(), param1)
    return err
}

// func执行正确,继续执行后续代码
Process(value)

Golang引入了一个关于错误处理的标准模式,即error接口,该接口的定义如下:

type error interface {
	Error() string
}

对于大多数函数,如果要返回错误,大致上都可以定义为如下模式,将 error 作为多种返回值中的最后一个,但这并非是强制要求:

unc main() {
	if res, err := compute(1, 2, "x"); err != nil {
		panic(err)
	} else {
		fmt.Println(res)
	}
}

func compute(a, b int, c string)(res int, err error) {
	switch c {
	case "+" :
		return a + b, nil
	case "-":
		return a - b, nil
	case "*":
		return a * b, nil
	case "/":
		return a / b, nil
	default:
		return -1, fmt.Errorf("操作符不合法")
	}
}

当然了,Golang中也可以像Java一样灵活地自定义错误类型,定义PathError结构体,并且实现Error接口后,该结构体就是一个错误类型了:

  • PathError
type PathError struct {
	Op string
	Path string
	Err error
}

func (e *PathError) Error() string {
	return e.Op + " " + e.Path + ": " + e.Err.Error()
}
  • main
    func GetStat(name string) (fi FileInfo, err error) {
        var stat syscall.Stat_t
        err = syscall.Stat(name, &stat)
        if err != nil {
            // 返回PathError错误类型
            return nil, &PathError {"stat", name, err}
        }
        // 程序正常,返回nil
        return fileInfoFromStat(&stat, name), nil
    }

这种异常处理方式是Golang的一大特色,外界对这种异常处理方式有褒有贬:

  1. 优点:代码清晰,所有的异常都需要被考虑到,出现异常后马上就需要处理
  2. 缺点:代码冗余,所有的异常都需要通过if err != nil {}去做判断和处理,不能够做到统一捕捉和处理
2.2、逗号 ok 模式

在使用Golang编写代码的过程中,许多方法经常在一个表达式返回2个参数时使用这种模式:,ok,第一个参数是一个值或者nil,第二个参数是true/false或者一个错误error。在一个需要赋值的if条件语句中,使用这种模式去检测第二个参数值会让代码显得优雅简洁。这种模式在Golang编码规范中非常重要。这也是Golang自身的函数多返回值特性的体现。

2.3、defer、panic及recover

defer、pannic及recover是Golang错误处理中常用的关键字,它们各自的用途为:

2.3.1、defer

defer的作用是延迟执行某段代码,一般用于关闭资源或者执行必须执行的收尾操作,无论是否出现错误defer代码段都会执行,类似于Java中的finally代码块的作用:

     func CopyFile(dst, src string) (w int64, err error) {
        srcFile, err := os.Open(src)
        if err != nil {
            return
        }
        // 延迟关闭srcFile
        defer srcFile.Close()
        dstFile, err := os.Create(dstName)
        if err != nil {
            return
        }
        // 延迟关闭dstFile
        defer dstFile.Close()
        return io.Copy(dstFile, srcFile)
    }

defer也可以执行函数或者是匿名函数:

defer func() {
	// 清理工作
} ()

// 这是传递参数给匿名函数时的写法
var i := 1
defer func(i int) {
	// 做你复杂的清理工作
} (i)

需要注意的是,defer使用一个栈来维护需要执行的代码,所以defer函数所执行的顺序是和defer声明的顺序相反的。

defer fmt.Println(1)
defer fmt.Println(2)
defer fmt.Println(3)

上述执行结果为

3
2
1
2.3.2、panic

panic的作用是抛出错误,制造系统运行时恐慌,当在一个函数执行过程中调用panic()函数时,正常的函数执行流程将立即终止,但函数中之前使用defer关键字延迟执行的语句将正常展开执行,之后该函数将返回到调用函数,并导致逐层向上执行 panic流程,直至所属的goroutine中所有正在执行的函数被终止。

panic和Java中的throw关键字类似,用于抛出错误,阻止程序执行。

以下是基本使用方法:

panic(404)
panic("network broken")
panic(Error("file not exists"))
2.3.3、recover

recover的作用是捕捉panic抛出的错误并进行处理,需要联合defer来使用,类似于Java中的catch代码块:

func main() {
      fmt.Println("main begin")
      // 必须要先声明defer,否则不能捕获到panic异常
      defer func() { 
        fmt.Println("defer begin")
        if err := recover(); err != nil {
            // 这里的err其实就是panic传入的内容
            fmt.Println(err) 
        }
         fmt.Println("defer end")
      }()
      f()
      // f中出现错误,这里开始下面代码不会再执行
      fmt.Println("main end") 
}

func f() {
   fmt.Println("f begin")
   panic("error")
   //这里开始下面代码不会再执行
   fmt.Println("f end") 
}

最后的执行结果为:

main begin
f begin
defer begin
error
defer end

利用recover处理panic指令,defer必须在panic之前声明,否则当panic时,recover无法捕获到panic。

三、并发编程

3.1、CSP(MPG)并发模型介绍及对比

在Java中,通常借助于共享内存(全局变量)作为线程间通信的媒介,但在Golang中使用的是通道(channel)作为协程间通信的媒介,这也是Golang中强调的:

不要通过共享内存通信,而通过通信来共享内存

在Java中,使用共享内存来进行通信常会遇到线程不安全问题,所以我们经常需要进行大量的额外处理,方式包括加锁(同步化)、使用原子类、使用volatile提升可见性等等。

CSP的指的是是Communicating Sequential Processes (CSP)的缩写,中文为顺序通信进程。CSP的核心思想是多个线程之间通过Channel来通信(对应到golang中的chan结构),这里的Channel可以理解为操作系统中的管道或者是消息中间件(不同之处在于这个MQ是为不同协程间服务的,而不是进程)

说到了CSP就得提一下Golang自身的并发模型MPG,MPG中M指的是内核线程、P指的是上下文环境、G指的是协程,其中M与P一起构成了G可运行的环境,M和P是一一对应关系,通过P来动态地对不同的G做映射和控制,所以Golang中的协程是建立在某个线程之上的用户态线程。

在这里插入图片描述

具体的细节譬如MPG如何映射、G的状态有哪些、调度器如何工作等不在此文展开。

3.2、Goroutine及Channel的使用

在Java中开启一个线程需要创建Thread实现类或Runnable实现类、重写run方法、通过t.start()开启线程执行特定任务,但在Golang中要开启一个Goroutine十分简单,只需使用go这个关键字即可。

// 开启协程执行一段代码
go fmt.Println("go")

// 开启协程执行函数
go SomeMethod(1, 1)

// 开启协程执行匿名函数
go func() {
    go fmt.Println("go")
}()

关于协程,有一些注意点:

  1. main函数运行的协程为主协程,其他协程为主协程的守护协程,当主协程死亡其它协程也会死亡
  2. 协程在执行完所需执行的方法及代码后会死亡,遇到panic导致程序结束时也会死亡

channel是Golang在语言级别提供的goroutine间的通信方式。我们可以使用channel在两个或多个goroutine之间传递消息,因此通过channel传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。

channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

一般channel的声明形式为:

var chanName chan ElementType

与一般的变量声明不同的地方仅仅是在类型之前加了chan关键字。 ElementType 指定这个channel所能传递的元素类型。举个例子,我们声明一个传递类型为 int channel:

var ch chan int

或者,我们声明一个 map ,元素是 bool 型的channel:

var m map[string] chan bool

初始化一个channel也很简单,直接使用内置的函数 make() 即可:

ch := make(chan int)

在channel的用法中,最常见的包括写入和读出。将一个数据写入(发送)至channel的语法很直观,如下:

ch <- value

向channel写入数据通常会导致程序阻塞,直到有其他goroutine从这个channel中读取数据。从channel中读取数据的语法是

value := <-ch

如果channel之前没有写入数据,那么从channel中读取数据也会导致程序阻塞,直到channel中被写入数据为止。我们之后还会提到如何控制channel只接受写或者只允许读取,即单向channel。

channel有如下特性:

  1. 读取、写入操作为原子操作,无需担心并发时的数据安全问题,channel内数据的写入对所有协程可见
  2. channel中阻塞的协程是FIFO的,严格按照入队顺序读写数据
  3. 对于非缓冲channel的读取和写入是同步发生的,写入会阻塞直到有读者,读取会阻塞直到有写者,类似于Java中的synchronousqueue;对于缓冲channel的读取和写入是异步的,写入时若队列已满则阻塞,直到有读者、读取时若队列为空则阻塞,直到有写者,类似于Java中的linkedblockingqueue
  4. 对于为nil的channel的写入和读取都会永久阻塞

四、垃圾回收

4.1、Java的垃圾回收体系

Java基于JVM完成了垃圾收集的功能,其体系很庞大,包括了垃圾回收器(G1、CMS、Serial、ParNew等)、垃圾回收算法(标记-清除、标记-整理、复制、分代收集)、可达性算法(可达性分析、引用计数法)、引用类型、JVM内存模型等内容,目前Java在JDK 1.7开始使用G1垃圾收集器来进行垃圾回收,其特性及回收过程大致如下:

在这里插入图片描述

4.2、Golang三色标记法

三色标记法,主要流程如下:

  1. 所有对象最开始都是白色
  2. 从root开始找到所有可达对象,标记为灰色,放入待处理队列
  3. 遍历灰色对象队列,将其引用对象标记为灰色放入待处理队列,自身标记为黑色
  4. 处理完灰色对象队列,执行清扫工作

要进一步学习可以参考这篇文章:http://legendtkl.com/2017/04/28/golang-gc/

Golang与Java:现代软件开发的两大工具对比 在现代软件开发领域,选择合适的编程语言对于项目的成功至关重要。在众多编程语言中,Golang(Go)和Java作为两大重要工具备受关注。Golang由谷歌开发,于2009年首次发布,旨在提供一种简洁、高效的编程语言,尤其适用于并发编程。Java则由Sun Microsystems于上世纪90年代推出,以其跨平台性、面向对象特性和强大的生态系统闻名于世,成为企业应用和大型系统开发的首选语言之一。 阅读详情

相关推荐

使用 Go 构建高可用的分布式系统:微服务架构及其与 Java 对比

微服务架构已成为现代软件开发的主流范式。在微服务中,一个应用被拆分为多个独立的服务,每个服务负责一部分功能。这种架构可以提高系统的可伸缩性、可维护性和可靠性。本文将探讨如何使用 Go 语言构建微服务架构,并通过实际案例分析 Go 在微服务中的应用。我们还将对比 Go 和 Java 在微服务方面的差异,以帮助您更好地了解两者的优缺点。

斌擎科技 631

golang和Java的简单介绍和对比

golang和Java的简单介绍和对比

Rcain_R的博客 3337

Go与Java数据库操作对比:使用Go连接和操作数据库

数据库操作是Web开发中的一个重要组成部分。在本文中,我们将介绍如何在Go中连接和操作关系型和非关系型数据库,并将其与Java在数据库操作方面进行对比。我们将介绍Go的流行数据库驱动,并提供Go和Java的示例代码,帮助您了解两者在数据库操作方面的差异和优劣。

斌擎科技 296

一文告诉你Golang和Java的区别

Golang和Java是两种非常流行的编程语言,它们分别具有自己的优点和特点。是否选择Golang或Java作为开发语言,往往要基于项目的实际需求和具体情况来进行准确的选择。在本文中,我们将探讨Golang和Java在性能、语法、标准库、生态系统等方面的区别与差异,涉及到实战经验以及多个案例分析。我们希望在深入了解Golang和Java之后,能够做出更为准确、理性的判断,以此为您带来更好的编程体验。

2301_78348935的博客 7649

智能座舱芯片大乱斗:高通8155 vs 联发科MT8676 vs 华为麒麟990A,谁才是性价比之王?

本文深入对比了高通SA8155P、联发科MT8676与华为麒麟990A三款主流智能座舱芯片的性能、生态与成本。文章从CPU/GPU/NPU算力、开发生态、成本模型及典型应用场景出发,分析了各自在智能座舱领域的优势与适用性,为开发者与车企选型提供了实战参考,并探讨了智能座舱芯片未来的技术趋势。

yhn456789的博客 807

手把手教你设计T型和Π型衰减器:从分贝计算到电阻选型全攻略

本文提供了一份T型和Π型衰减器的详细设计指南,涵盖从分贝计算到电阻选型的全过程。文章以50欧姆系统为例,通过公式推导和实例演示,手把手教你计算两种经典拓扑的电阻值,并深入探讨了电阻选型、误差控制及高频应用等关键实践技巧,帮助工程师和爱好者精准实现信号衰减与阻抗匹配。

blue42的博客 1340

golang和Java对比(整体和语法对比)

选择Golang还是Java取决于项目需求、团队的熟悉度和特定的应用场景。Golang以其简洁、高效和出色的并发支持,在云基础设施和微服务架构方面表现优异。而Java则以其强大的生态系统、跨平台能力和广泛的应用场景,在企业级应用和移动开发领域保持着强大的竞争力。选择哪种语言,应基于项目的具体需求和团队的技术栈进行决定。GolangJava。

用文字记录下每一个瞬间的感动和每一次思考的火花 10万+

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 240

选Java还是Golang?

最近Java转Golang的话题非常火热,本篇文章简单介绍我对Java与go的看法。

在岗Golang后端开发,分享一些日常笔记和代码 1893

Windows 11下JDK 21与JMeter 5.6.3环境配置全攻略

环境变量是操作系统管理软件路径与执行权限的核心机制,它通过预设的键值对,指引系统在调用命令时定位可执行文件。理解其工作原理,是解决软件安装后“命令未找到”等问题的关键。对于Java生态而言,正确配置JAVA_HOME和Path变量,不仅能让java、javac等基础命令全局可用,更是Maven、Gradle乃至JMeter等众多工具链顺畅运行的基石。JMeter作为一款基于Java开发的经典性能测试与接口测试工具,其稳定运行高度依赖健全的Java环境。本文聚焦于在Windows 11系统上,为JDK 21与

weixin_30940783的博客 451

量子化学仿真软件:VASP_(7).表面与界面性质模拟

在量子化学仿真软件领域,表面与界面性质的模拟是研究多相催化、表面反应、材料科学等领域的关键工具。VASP(Vienna Ab Initio Simulation Package)作为一种广泛使用的密度泛函理论(DFT)计算软件,提供了强大的功能来模拟表面与界面的性质。本节将详细介绍如何使用VASP进行表面与界面性质的模拟,包括模型构建、输入文件准备、计算设置、结果分析等步骤。

kkchenjj的博客 951

Golang与Java各方面使用对比(上)

本文只对比Golang与Java的基本情况、基本使用、结构体函数及指针三块内容,下一篇文章会对比面向对象、异常处理、并发编程及垃圾回收的差异。

BoringError的博客 1万+

基于coze studio开源框架二次定制开发教程

CozeStudio是一站式AIAgent开发工具,支持大模型接入、智能体编排、工作流开发等功能。采用Golang+React技术栈,基于微服务架构设计。项目包含后端API、领域逻辑、前端应用等模块,支持自定义任务流节点开发。开发流程涵盖前后端节点定义、实现逻辑编写等步骤,提供完整的开发规范和参考文档。相比商业版,开源版本在功能上有所精简,但仍保留核心开发能力。

coding change your life 792

GO中使用protobuf,性能和java、rust、c++对比

GO中使用protobuf 性能对比java劣势 rust protobuf

cention168的专栏 1316

华为OD机试 新系统 双机位C卷 真题题库目录|机考题库 + 算法考点详解

本文整理华为OD机试(机考) 新系统真题题库,提供高频考点精析与详细题目内容,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解 和 在线OJ做题练习。华为OD机试新系统真题题库。

qq_45776114的博客 10万+

基于AI大模型实现自然语言转SQL、SQL解释、SQL优化和SQL转换

随着大数据和人工智能技术的发展,数据分析和数据挖掘在各行各业中的应用越来越广泛。SQL(Structured Query Language)作为关系数据库的查询语言,是数据分析的重要工具。然而,SQL语言的复杂性和专业性使得许多非技术背景的用户难以直接使用,阻碍了数据的广泛利用。为了降低SQL的使用门槛,许多研究者和企业开始探索如何通过自然语言处理(NLP)技术,将自然语言转化为SQL查询语句,从而让用户可以通过自然语言与数据库进行交互。

AI天才研究院 2240

【Go语言学习笔记】深入理解 Go map:使用、底层原理与 Java Map 全面对比

从入门到深入剖析,一文读懂 Go 语言中的 map —— 从基本语法到底层结构,从内存管理到与 Java HashMap 的差异。

往者之不谏 来者犹可追 1103

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C/C++、Java、Go、Python总结对比16-public、protect和private使用总结对比

想了解这3个修饰符的使用请查看专栏的前几篇文章。 根据c++、java和Python的使用总结如下: 1. java比c++多了default修饰的类成员,并引入了包的概念,default在当前包内可被访问; 2. 为了简化记忆,可以这样理解,public和private不用记忆,一个可以在任何地方被访问,一个只能在类内被访问; 3. c和java的protect的用法有所区别,ja...

aeoob的博客 331

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

论“单例模式”三种语言(PHP、Golang、Java)对比及使用

单例模式(Singleton Pattern) 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。 注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 介绍 意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 主要解决:一个全局使用的类频繁地

578

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Go vs JAVA

https://www.educba.com/go-vs-java/ Difference Between Go vs Java Go, also known as Golang, is a programming language. Being an open-source language for programming, Go makes it easy to build reliable,...

michaelforgood的博客 521

Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序

Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1 创建第一个Go程序Go 语言 入门 && 基于 GoLand 2023.1

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 5万+

Why not Go ? Golang入门笔记1

各位狗(Go)年大吉~这是我的Golang入门笔记开篇之作(PS:重点是笔记,用来记录一些细节上的注意点而非入门教程)接下来就开始我的表演~0x00 我看Golang第一次听说Golang,还是在学Python爬虫的时候,看到也有人用Golang写爬虫,但苦于只会一点Python和C,并不能完全看懂Go语言。如今来正式学习Golang,心情难免激动。看了一些Go语言的示例代码和语言特性,竟然有种似...

cossack9989的博客 727

项目中要不要使用 Go?我是这么思考的

我最近决定在一个新项目中使用 GoLang 来实现一组增删改查的 API。在此之前,我较为熟悉 Java,Groovy,了解一些 Python。 我大部分的经验都是使用 Java 或者 Groovy 加上 Spring Boot。这让我感到有些无聊,所以为什么不来学点儿东西找找乐子呢? 要求 以下是一些要求。 设计并实现领域数据模型 实现增删改查 API 在后...

请叫我开发专家 619

C/C++、Java、Go、Python总结对比12-指针的定义和使用

指针是c、c++和go这些需要动态分配内存等功能的语言用到的,笔者在刚开始使用的时候,经常混淆指针的定义和使用,下面总结一下。 c/c++的写法 void pointDemo() { int normalVar = 1; //定义普通变量 int *pointVar1 = &normalVar; //定义指针变量 int *pointVar2 = 2; ...

aeoob的博客 330

274-golang多态浅析

golang多态浅析 首先我们说一下什么是多态 接口的多种不同的实现方式就是多态 比如在java中,两个类实现同一个接口 比如这样 public interface Person{ public void SayHello(); } public class Student implements Person{ public void SayHello()...

Lich Howger 544

C/C++、Java、Go、Python总结对比3-字符串的定义及使用

字符串是大家一定会使用到的,因为经常会被用来将结果输出到控制台来查看结果是否正确。 下面来看下5种语言不同的写法: c的写法 #include <stdio.h> int main() { char strVar[] = "hello"; printf(strVar); } c++的写法 #include <iostream> #inclu...

aeoob的博客 308
上一篇: Golang与Java各方面使用对比(上)
下一篇: Golang-go mod download 出现 dial tcp 34.64.4.17:443: i/o timeout
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值