Java快速转Go入门案例

这篇具有很好参考价值的文章主要介绍了Java快速转Go入门案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Golang语言在2009年诞生于谷歌,相较而言是一门年轻的语言。面对C++等老牌语言众多繁重的特性,几名谷歌员工希望能够甩开历史包袱设计一门更加简洁的编程语言,避免过度的设计,通过较少的特性组合连接就可实现复杂的功能。体现“少即是多”设计哲学。

一、Go入门案例

以下是用一个Go实现的栈数据结构

package collection //声明当前代码文件所在的包,相同路径下的Go文件包名必须相同
import "errors" //导入error包,Go中错误只能显式的定义/返回/处理,不能抛出/捕获

//结构体struct:类似于Java中的类,但是结构体中只能定义属性,且不存在继承的概念,只有组合和接口
type Stack struct {
	data []string //切片:类似于Java中的数组,但是Go中切片的大小是可动态扩展的,底层基于数组,更像是Java中的ArrayList
}

//函数func:参数前添加*号表示传递引用,不加表示传递数据的副本
func (s *Stack) Push(x string) { //访问权限:Go中函数和变量有两级访问权限,大写字母开头表示包外可访问,小写开头表示只在包内可见,例如Stack中的data变量
	s.data = append(s.data, x) //append()是Go中的内置函数,可直接调用,用于向切片尾部添加一个元素,并返回新的切片
}

//函数支持多重返回值
func (s *Stack) Pop() (string, error) {
	n := len(s.data) //len()也是内置函数 用于获取切片数组长度
	if n == 0 {
		//支持多重赋值
		r, b := "", errors.New("Pop empty stack error!") //定义一个错误
		return r, b //函数中定义的变量必须有使用否则会报错
	}
	res := s.data[n-1] //:=符号用于快速创建并赋值一个新变量(编译时会自动进行类型推断,Go本身是强类型语言)
	s.data[n-1] = "" //为了避免内存泄漏
	s.data = s.data[:n-1] //s.data[:n-1]表示返回对原始数组的一个新的切片视图[0,n-1),不会改变原数组元素
	return res, nil //nil可表示切片、struct、接口等类型的空值
}

//返回栈的大小
func (s *Stack) Size() int {
	return len(s.data)
}

使用这个栈

package main //main函数只有定义在main包下才可执行

import (
	"HelloGo/collection" //导入collection包
	"fmt" //Go的标准输入输出包
)

//输出: Hello, world!
func main() {
	var s collection.Stack //var表示声明一个变量
	pop, err := s.Pop()
	if err != nil { //if条件可不带括号
		fmt.Println(pop + err.Error()) //打印错误信息
	}
	s.Push("world!") //Go中没有构造器的概念,当声明一个变量而没有明确地初始化时,会自动初始化为默认值
	s.Push("Hello, ") //对于结构体变量,即内部所有字段初始化为默认值,切片默认为nil表示初始化一个空数组。
	for s.Size() > 0 {  //故在这里s可以直接使用
		res, _ := s.Pop() //使用下划线忽略第二个返回值
		fmt.Print(res)
	}
}

二、Go的核心特性

  • 跨平台:Go的标准库提供了一系列与操作系统无关的接口和实现,并且Go的编译器本身就具备支持多种操作系统和硬件架构的能力,通过静态链接的方式可直接将程序编译为对应平台的机器码,故Go可以实现跨平台即“一次编写,到处运行”。此外Go还支持交叉编译,即在一个操作系统上编译出适用于另一个操作系统的可执行文件。Go的跨平台由于不需要虚拟机作为中间人,因此更加轻量级,启动和运行更快。
  • 自动内存管理:Go和Java一样,内存是自动分配和回收的。不过目前Go的垃圾回收器相对简单,就是基于三色标记法的非并发GC。
  • 组合与接口:Go通过使用接口和组合而不是继承来实现代码复用。至于Go是不是面向对象,官网的回答是Yes or no,Go既可以通过将函数绑定在结构体上设计出具有面向对象风格的程序,也可以按照面向过程的方式设计和编程。
  • 高性能并发:Go的并发执行单元是协程(gorountine),可看做用户级的线程,由Go在用户层面实现协程任务的调度,协程和内核线程可以是多对一的关系,内核线程是无感知的,可避免过多的线程带来内核调度和上下文切换开销。例如在面对一组IO密集型任务时,普通的多线程在IO阻塞等待时需要挂起让出CPU切换下一个线程,而Go只需要切换下一个协程,内核线程不需要切换。
  • 函数式编程:函数可以像变量一样被赋值、传递、作为返回值。
  • 简洁:语法简洁,如多重赋值、类型自动推断、for range语法等,但语法细节上有许多强制规定,这有助于统一代码风格。Go是静态类型并且是强类型的,变量在编译期就确定类型,且不存在类型的隐式转换。

三、语法特性细节

1. 函数类型

函数是Go的一等公民,被赋予了与其他数据类型(如整数、字符串和结构体)相同的地位。

//声明函数类型
type binOp func(int, int) int
//定义函数变量op
var op binOp
//声明并初始化函数变量add
add := func(i, j int) int { return i + j }

op = add//赋值
//函数调用
n := op(100, 200)  // n = 100 + 200

2. 并发编程

使用go关键字可直接开启一个协程执行对应函数,channel通道用于在协程间通信

package main

import (
	"fmt"
	"time"
)

func main() {
	//内置函数make()用于创建指定初始大小的哈希表、通道、切片等
	ch := make(chan int, 10) //创建缓冲区大小为10字节的channel通道
	go func() { //go关键字可直接开启一个协程执行对应函数
		time.Sleep(time.Second*5)
		ch <- 123  //在goroutine中向channel发送数据
	}() //这里定义了一个匿名函数,后面的()为传参
	val := <-ch  //主goroutine阻塞式从channel接收数据
	fmt.Println(val)
	close(ch) //关闭后可读不可写
}

WaitGroup:用于等待一组goroutines的完成。

Mutex:Go中的锁,用于保护共享资源,防止协程同时访问。

package main

import (
	"fmt"
	"sync" //并发包
)

func main() {
	var wg sync.WaitGroup
	var mu sync.Mutex //独占锁
	var num int
	for i := 1; i <= 5; i++ {
		wg.Add(1) //增加一个计数
		go func() {
			defer wg.Done() //减少一个计数,defer确保函数执行完毕后wg.Done()再执行,类似finally块
			mu.Lock()   // 获取锁
			num++       // 修改共享资源
			mu.Unlock() // 释放锁
		}()
	}
	wg.Wait() // 等待所有goroutine完成,即wg内部计数为0
	fmt.Println(num) //5
}

Cond:条件等待队列,用于在特定条件下阻塞或唤醒一个或多个goroutines。

3. defer关键字

当在函数中使用 defer 关键字时,它会使后面的函数调用被推迟执行,直到当前函数的执行结束。这意味着无论函数是正常返回还是发生了异常,defer 的函数都会被执行,类似Java中的finally块。如果在同一个函数中多次使用 defer,它们的执行顺序是后进先出(LIFO),也就是最后一个 defer 的函数最先执行,依次类推。

defer语句只会影响其声明位置之后的代码。

4. 错误处理

Go有两种错误处理机制:

  • error:大部分函数返回errors
  • panic:只有真正的不可恢复条件,例如超过范围的索引才会产生真正的运行时异常,称为panic
package main

import "fmt"

func main() {
	arr := []int{1, 2, 3}
	defer func() {
		//if可接受一个初始化语句,该语句通常用于设置局部变量
		if r := recover(); r != nil { //使用recover函数可捕获panic
			fmt.Println("发生了运行时错误:", r)
		}
	}()
	for i := 0; i <= 4; i++ {
		value := arr[i] // 当i=3时数组越界,触发panic
		fmt.Println("数组元素值:", value)
	}
}

参考:https://zhuanlan.zhihu.com/p/492270360文章来源地址https://www.toymoban.com/news/detail-815060.html

到了这里,关于Java快速转Go入门案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【个人介绍】后端研发工程师

    1. 熟悉JAVA基础、多线程、并发编程、设计模式、数据结构与算法、JVM原理与调优等。 2. 熟悉SpringBoot、SpringCloud、SpringCloud Alibaba、JPA、MyBatis等框架。 3. 熟悉数据库设计、MySQL原理与索引优化、Redis、Memecache、MongoDB等。 4. 熟悉Nginx、主从集群、TCP/IP、NIO编程、Reactor模式、Nett

    2023年04月09日
    浏览(56)
  • 怎样成为优秀的后端工程师

    本文翻译自国外论坛 medium,原文地址:https://medium.com/@pradeesh-kumar/how-to-become-a-good-backend-engineer-9da75202a104 让我们一起看看国外开发者认为优秀后端工程师需要掌握哪些技能。 本质上,软件开发有两个要素:前端和后端。当访问者登陆网站时,他们会看到 UI 与之交互,即前端

    2024年02月03日
    浏览(47)
  • 后端开发工程师需要了解的数据库知识

      作为一为 Java 开发工程师,写数据的查询 SQL 是必备的技能。在 日常生活中,是否统计过读数据和写数据的频率。以来开发经验来说,查询数据的操作语言是多于写数据的。   有的信息系统,数据只初始化一次,甚至是服务一辈子。   接触过很多的 web 开发系统,都是为

    2024年02月08日
    浏览(54)
  • 一个后端工程师对前端云 Vercel 的体验和探索

    今天小猿姐特邀咱们资深的程序猿为大家带来产品的体验报告。 Vercel 是一个为前端开发者设计的一体化平台(前端云),可以帮助开发者快速地将网站和应用程序部署到各种环境中,并且提供了一个灵活、可扩展和安全的平台,非常适合开发者在不同平台和环境中进行开发

    2024年04月17日
    浏览(36)
  • 慕课网 Go工程师 第三周 package和gomodules章节

     包名前面加匿名,只引入但不使用,如果对应包有init函数,会执行init函数(初始化操作) 包名前面加. 把这个包的结构体和方法导入当前包,慎用,你不知道当前包和被引入的包用没有重名的结构体或者方法。  包名前面 起一个别名 go.mod 自动管理依赖包,不需要我们管理

    2024年02月11日
    浏览(39)
  • 快速拿下 AI Prompt 工程师证书攻略!

     Datawhale干货  贡献者:许文豪、司玉鑫、甘元琦 Prompt 是 AI 2.0 时代打开大模型能力的金钥匙,它能够大大的提高工作效率。 如果把大语言模型 (LLM,Large Language Model) 具象成一个的 员工 ,那 Prompt 提示词则好比是你给员工下的指令,你给出的指令越详细,员工执行的结果就

    2024年02月03日
    浏览(99)
  • 机器视觉工程师不会选型,如何快速准确选型

    机器视觉工程师不会选型,如何快速准确选型

    2024年02月19日
    浏览(50)
  • 怎么快速转行并学习提示工程师的方法

    chatgpt的出现毫无疑问打破了原有的商业格局, 各个公司都已逐渐使用chatgpt来取代人工,反正老板总是提出各种逆天的要求,但chatgpt可不一定听得懂,雇一个翻译那可真是一个好主意 -------------提示工程师 以往要费几天功夫的搜集整理分析工作,有了chatgpt分分钟搞定,机械

    2024年02月09日
    浏览(45)
  • AI工程师在崛起,我们如何做到快速转型

    W...Y的主页 😊  代码仓库分享💕 前言:针对目前AI快速发展,越来越多的程序员遭到裁员的风险,AI终将取代程序员的事情好像可以板上钉钉,程序员的行业已经开始走向下坡路,我们的内心不免有一些慌乱,但是AI程序员却在悄悄崛起,并且在不断的推进,我们应该怎么办

    2024年02月05日
    浏览(47)
  • 加入云原生实战营(星球),带你进阶 Go + 云原生高级开发工程师

    过去 1 年,趁着闲暇时间,我创建了一个 Go + 云原生技术学习社群,旨在帮助你快速进阶为 Go + 云原生高级开发工程师,提高你的职场竞争力、扩展职业宽度,最终谋得一份好差事(进入大厂、升职加薪)。 本篇文章,我来详细介绍下云原生实战营知识星球,让你对本知识星

    2024年04月08日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包