网站首页 > 教程文章 正文
1. Go语言简介
Go(又称Golang)是Google开发的一种静态强类型、编译型语言,于2009年正式发布。与Python和JavaScript相比:
- 编译型 vs 解释型:Go是编译型语言(像C++),而Python和JS是解释型语言
- 类型系统:Go是静态类型,Python是动态类型,JS是弱类型
- 并发模型:Go内置goroutine和channel,而Python/JS使用多线程/事件循环
- 性能:Go性能接近C,远高于Python和JS
2. 开发环境搭建
安装Go
官网下载安装包:https://golang.org/dl/
验证安装:
go version
第一个程序:Hello World
比较三种语言的实现:
Go版本:
package main // 声明包名
import "fmt" // 导入标准库
func main() { // 主函数
fmt.Println("Hello, World!") // 打印语句
}
Python版本:
print("Hello, World!")
JavaScript版本:
console.log("Hello, World!");
Go的特点:
- 必须明确包声明(package main)
- 必须明确导入依赖(import "fmt")
- 函数必须明确声明func关键字
- 大括号是强制的,不能省略
3. 基础语法
变量声明
Go版本:
// 显式声明
var name string = "Alice"
var age int = 25
// 类型推断
var height = 175.5 // float64
weight := 68.2 // 简短声明方式
// 多变量声明
var a, b, c = 1, 2, "three"
Python版本:
name = "Alice"
age = 25
height = 175.5
a, b, c = 1, 2, "three"
JavaScript版本:
let name = "Alice";
const age = 25;
let height = 175.5;
let [a, b, c] = [1, 2, "three"];
Go的特点:
- 类型可以显式声明或由编译器推断
- :=是声明并赋值的简短形式
- 变量一旦声明必须使用,否则编译错误
基本数据类型
类型 | Go示例 | Python对应 | JS对应 |
整数 | var x int = 42 | x = 42 | let x = 42 |
浮点数 | var y float64 = 3.14 | y = 3.14 | let y = 3.14 |
布尔 | var b bool = true | b = True | let b = true |
字符串 | var s string = "hello" | s = "hello" | let s = "hello" |
Go的特殊类型:
- rune:表示Unicode码点,相当于int32
- byte:相当于uint8
控制结构
if-else语句
Go版本:
if age >= 18 {
fmt.Println("Adult")
} else if age > 12 {
fmt.Println("Teenager")
} else {
fmt.Println("Child")
}
// 带初始化语句的if
if score := getScore(); score >= 60 {
fmt.Println("Pass")
}
Python版本:
if age >= 18:
print("Adult")
elif age > 12:
print("Teenager")
else:
print("Child")
JavaScript版本:
if (age >= 18) {
console.log("Adult");
} else if (age > 12) {
console.log("Teenager");
} else {
console.log("Child");
}
Go的特点:
- 条件表达式不需要括号
- 大括号是必须的
- 支持在if条件前执行一个简单的语句
for循环
Go版本:
// 传统for循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// while风格的循环
n := 0
for n < 5 {
fmt.Println(n)
n++
}
// 无限循环
for {
fmt.Println("Loop forever")
break
}
Python版本:
# 传统for循环
for i in range(5):
print(i)
# while循环
n = 0
while n < 5:
print(n)
n += 1
# 无限循环
while True:
print("Loop forever")
break
JavaScript版本:
// 传统for循环
for (let i = 0; i < 5; i++) {
console.log(i);
}
// while循环
let n = 0;
while (n < 5) {
console.log(n);
n++;
}
// 无限循环
while (true) {
console.log("Loop forever");
break;
}
Go的特点:
- 只有for关键字,没有while
- 循环条件不需要括号
- 初始化语句可以使用简短声明(:=)
4. 函数基础
函数定义
Go版本:
// 基本函数
func add(a int, b int) int {
return a + b
}
// 参数类型简写
func multiply(a, b int) int {
return a * b
}
// 多返回值
func swap(x, y string) (string, string) {
return y, x
}
// 命名返回值
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return // 裸返回
}
Python版本:
def add(a, b):
return a + b
def multiply(a, b):
return a * b
def swap(x, y):
return y, x
def split(sum):
x = sum * 4 // 9
y = sum - x
return x, y
JavaScript版本:
function add(a, b) {
return a + b;
}
const multiply = (a, b) => a * b;
function swap(x, y) {
return [y, x];
}
function split(sum) {
const x = Math.floor(sum * 4 / 9);
const y = sum - x;
return [x, y];
}
Go的特点:
- 参数类型在变量名之后
- 返回值类型在参数列表之后
- 支持多返回值
- 可以给返回值命名,简化return语句
defer关键字
Go特有的defer语句会将函数推迟到外层函数返回之后执行:
func readFile() {
file, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer file.Close() // 确保在函数返回前关闭文件
// 处理文件内容
}
相当于Python的with语句或JS的try-finally:
Python版本:
with open('file.txt') as file:
# 处理文件内容
pass
JavaScript版本:
let file;
try {
file = fs.openSync('file.txt', 'r');
// 处理文件内容
} finally {
if (file) fs.closeSync(file);
}
Go的defer特点:
- 推迟的函数调用会被压入栈中,在外层函数返回时按后进先出顺序执行
- 常用于资源清理(文件关闭、解锁等)
- 参数在defer语句时求值,而非调用时
上篇介绍了Go语言的基础语法,通过对比Python和JavaScript的实现,可以帮助有其他语言基础的开发者快速理解Go的特性。接下来中篇将深入探讨Go的复合数据类型、方法和接口等核心概念。
猜你喜欢
- 2025-05-02 本想搞清楚ESM和CJS模块的转换问题,没想到写完我的问题更多了
- 2025-05-02 ES6 的新增语法(es6最新语法)
- 2025-05-02 2024年,你需要掌握的 30 个 JavaScript 面试问题和答案(基础篇)
- 2025-05-02 开发一个 App Clip 并不难!我们立马上开发教程
- 2025-05-02 如何编写干净、可维护的 JavaScript 代码
- 2025-05-02 如何用 Parse 和 Swift 搭建一个像 Instag
- 2025-05-02 Window 对象和 var(windows对象和document对象)
- 2025-05-02 ES6 新增了哪些新特性 (二)(es6新增了什么)
- 2025-05-02 JavaScript篇面试题(js 常见面试题)
- 2025-05-02 系列专栏(六):解构赋值(解构赋值的好处)
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)