Java程序员学Go语言指南(上篇)_java程序员入门书籍

createh51个月前 (02-09)技术教程19

环境配置篇:从JDK到GoRoot

1. 安装对比

  • Java:安装JDK → 配置JAVA_HOME → javac验证
  • Go:官网下载.msi → 自动设置GOROOT → go version验证

2. VS Code配置差异

# Java环境
安装Extension Pack for Java
需要配置Maven路径

# Go环境
安装Go扩展(Go Team at Google)
自动安装gopls等工具链

3. 项目初始化实战

// Java项目结构(Maven)
src/
  main/
    java/
      com/example/
        Main.java
pom.xml
// Go项目结构
go.mod       // 类似pom.xml
main.go
└── utils/   // 自定义包
    └── math.go

基础语法篇:当Java遇上Go

1. 变量声明对照表

场景

Java写法

Go写法

核心差异

显式声明

int count = 10;

var count int = 10

类型后置

类型推断

var list = new ArrayList<>()

list := []string{}

短变量声明

多变量声明

不支持

a, b := 1, "hello"

元组式赋值

2. 数组与切片(关键差异点)

// Java数组 vs ArrayList
int[] arr = {1,2,3};                  // 定长
ArrayList list = new ArrayList<>(); // 动态扩容
list.add(4);
// Go数组 vs 切片
arr := [3]int{1,2,3}        // 定长数组
slice := []int{1,2,3}       // 动态切片
slice = append(slice, 4)    // 扩容需重新赋值

// 内存细节:切片底层引用数组
header := slice[:2]         // 创建新切片头(共享底层数组)

3. 流程控制对比

循环结构

// Java三剑客
for (int i=0; i<5; i++) { /*...*/ }
while(condition) { /*...*/ }
do { /*...*/ } while(condition);
// Go的万能for
for i := 0; i < 5; i++ { /* 传统循环 */ }
for condition { /* while替代 */ }
for { /* 无限循环 */ break }

Switch陷阱

// Java需要break
switch (x) {
  case 1: 
    System.out.println("one");
    break; // 必须显式阻断
  default:
    System.out.println("other");
}
// Go默认不穿透
switch x {
case 1:
    fmt.Println("one") // 自动break
case 2,3:             // 多值匹配
    fmt.Println("two or three")
default:
    fmt.Println("other")
}

函数篇:从方法到一等公民

1. 基础函数差异

// Java方法
public static int add(int a, int b) {
    return a + b;
}
// 单返回值
// 必须属于某个类
// Go函数
func add(a, b int) int {
    return a + b
}
// 独立存在
// 支持多返回值

2. 多返回值革命

// 文件读取的典型模式
func readFile(path string) ([]byte, error) {
    content, err := os.ReadFile(path)
    return content, err
}

// 调用时显式处理错误
data, err := readFile("test.txt")
if err != nil {
    log.Fatal(err)
}

3. 函数式编程初探

// Java Lambda
List nums = Arrays.asList(1,2,3);
nums.stream()
    .map(x -> x * 2)
    .forEach(System.out::println);
// Go匿名函数
nums := []int{1, 2, 3}
// 立即执行函数
func() {
    fmt.Println("立即执行!")
}()

// 函数作为参数
transform := func(x int) int { return x * 2 }
for _, n := range nums {
    fmt.Println(transform(n))
}

避坑指南:Java转Go常见错误

  1. 分号依赖:Go编译器自动加分号,行尾不能随意换行
   // 错误写法
   return 
   result // 实际返回的是空值

   // 正确写法
   return result
  1. 作用域误解
   if num := 10; num > 5 {
       fmt.Println(num) // 正确
   }
   fmt.Println(num) // 编译错误!num只在if块内有效
  1. 值传递陷阱
   func updateSlice(s []int) {
       s[0] = 9       // 修改底层数组
       s = append(s, 4) // 创建新切片
   }
   // 调用者看到的切片长度不变!

上篇实战作业

  1. 将Java版冒泡排序改写为Go实现
  2. 实现一个多返回值函数:计算圆面积和周长
  3. 用Go重写Java工具类中的字符串处理方法

(提示:Go标准库常用包 - strings, strconv, math)


下篇预告:中篇将深入Go的"结构体+接口"面向对象模型,揭秘defer的黑魔法,并对比Go Module与Maven的依赖管理哲学。

相关文章

三十分钟入门基础Go(Java小子版)_java小白入门

前言Go语言定义Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态、强类型、编译型语言。Go 语言语法与...

Java与Go语言:实际应用体验的深度剖析

在软件开发领域,Java和Go作为两种极具影响力的编程语言,各自凭借独特的特性和优势,在不同的应用场景中大放异彩。Java凭借其强大的生态系统、丰富的类库和广泛的应用领域,长期占据着企业级开发的重要地...

Java:Java 和Go—你应该知道的8个主要区别

  因为有太多的编程语言可供选择,开发人员经常对哪一种最适合他们的项目感到困惑。因此,今天我们将介绍Java与 Go。Java 和Go都是全球非常流行的语言,它们争夺对服务器端 Web 应用程序的控制...

Java程序员学习go语言之提高篇_go语言工资高还是java工资高

作为一名精通Java的开发者,在掌握Go语言基础后,深入探索Go语言的高级特性,能让你在编程领域拓展新的边界。Go语言凭借其独特的设计理念,在并发编程、内存管理、工具链等方面展现出卓越的性能与优势,为...

有一定的c++ go java的编程基础,如何3天学会flutter开发

如果你有多种编程语言的基础,想要在 3 天内学会 Flutter 开发,可以按照以下的计划来进行:第一天:熟悉 Flutter 基础环境搭建首先,安装 Flutter SDK。根据 Flutter 官...