当前位置:首页 > 技术 > 正文内容

Go语言基础入门指南

访客 技术 2026年7月11日 3

Go语言简介

Go语言(也叫Golang)是由Google开发的一种编译型静态语言。开发者需要先编写Go代码,然后将其编译为可执行文件,才能在对应的操作系统上运行。开发环境通常需要安装Go SDK,它提供了一套管理代码资源的工具。常用命令包括:go build(编译代码生成可执行文件)和 go run(编译并立即运行代码,中间的编译产物会被自动清理)。

第一个程序:Hello World

下面是一个最基础的Go程序:

package main // 每个Go文件需要声明所属包,main包是程序的起点

import "fmt" // 导入标准库中的fmt包,用于格式化输出

func main() { // main函数是程序入口,无参数无返回值
    fmt.Println("hello world")
}

在GoLand等IDE中,可以直接右键文件选择"运行"来编译执行。通常,一个Go项目只有一个main包,且入口为main包下的main函数。学习阶段,我们可以将每个Go文件单独编译运行。

注意:Go语言要求导入的包必须在代码中实际使用,否则编译器会报错。这样做可以有效避免不必要的内存和性能浪费。GoLand等编辑器会智能地自动管理包导入——当你使用某个包时自动添加导入语句,删除相关引用后也会移除对应的导入行。

变量命名规范

基本规则

变量名可以由字母(包括Unicode字符)、下划线和数字组成,但数字不能开头。Go语言区分大小写。应避免使用以下25个关键字37个保留字作为变量名:

关键字:

break      default       func     interface   select
case       defer         go       map         struct
chan       else          goto     package     switch
const      fallthrough   if       range       type
continue   for           import   return      var

保留字(内置常量、类型和函数):

true false iota nil
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
make len cap new append copy close delete
complex real imag panic recover

常见命名风格

  • Go语言:变量和函数名采用小驼峰(如myVariable),文件名采用下划线(如my_file.go
  • 对比Python:全下划线风格(如my_variable
  • 对比Java:全驼峰风格(如MyVariable

变量声明

Go中声明的变量必须被使用,否则编译器会报错。三种基本声明方式如下:

// 完整声明:var 变量名 类型 = 值
var name string = "leethon"

// 类型推导:var 变量名 = 值
var name = "leethon"

// 简短声明:变量名 := 值(省略var)
name := "leethon"

一次性声明多个变量:

// 完整声明多个,类型必须一致
var name, age, hobby string = "leethon", "19", "篮球"

// 使用var分组,每个变量可单独指定类型
var (
    name string = "leethon"
    age int = 19
    hobby = "篮球"
)

// 类型推导,类型可以不同
var name, age, hobby = "leethon", 19, "basketball"

// 简短声明,类型可以不同
name, age, hobby := "leethon", 19, "basketball"

先声明后赋值:必须使用完整声明语法,变量会获得对应类型的零值。

var name string  // 默认为 ""
var age int      // 默认为 0

数据类型

可以使用%T占位符打印变量类型:

fmt.Printf("a的值是:%v, 类型是:%T", a, a)

数字类型

  • 有符号整型int8(-128~127)、int16int32int64int(32位系统上为int32,64位系统上为int64)
  • 无符号整型uint8(0~255)、uint16uint32uint64uint
  • 浮点型float32float64
  • 复数complex64complex128
  • 别名byteuint8的别名,runeint32的别名

字符类型

// 字符串:使用双引号或反引号
"hello"
`多行
字符串`

// 单引号:表示字符编码对应的整型值
var a, b, c = 'a', '2', '三'
fmt.Printf("%T %v, %T %v, %T %v", a, a, b, b, c, c)
// 输出:int32 97, int32 50, int32 19977

布尔类型

var flag bool = true
var f bool = false

自由数据类型

any(Go 1.18+)可用于声明变量或形参,由实际传入的值决定具体类型。

常量

使用const关键字声明,声明后不可修改:

const pi float64 = 3.14159
const name = "leethon"

// 多常量声明
const (
    male = 1
    female = 2
    unknown = 0
)

// 依赖规则:未赋值的常量自动与前一个相同
const (
    a = 10
    b        // b = 10
)

iota:递增枚举器

iotaconst块中从0开始,每新增一行常量声明就自增1,常用于枚举:

const (
    unknown = iota   // 0
    male             // 1
    female           // 2
)

复杂用法:

const (
    a = iota      // 0
    b             // 1
    c             // 2
    d = "ha"      // 独立值,iota仍递增到3
    e             // "ha", iota=4
    f = 100       // iota=5
    g             // 100, iota=6
    h = iota      // 7,恢复使用iota
    i             // 8
)

结合位运算:

const (
    KB = 1 << (iota * 10)  // 1 << 10 = 1024
    MB                     // 1 << 20
    GB                     // 1 << 30
)

函数

main函数

每个可执行程序必须有main函数,它是程序入口,无参数无返回值。

函数定义与调用

// 无参函数
func test() {
    fmt.Println("无参函数")
}

// 有参函数,必须指定参数类型
func test1(a int, b string) {
    fmt.Println(a, b)
}

// 相同类型的参数可以简写
func test2(a, b int, c string) {
    fmt.Println(a, b, c)
}

// 有返回值
func add(a, b int) int {
    return a + b
}

// 多返回值
func swap(a, b int) (int, int) {
    return b, a
}

// 调用示例
func main() {
    test()
    test1(11, "leethon")

    sum := add(1, 2)
    x, y := swap(3, 4)

    // 使用 _ 忽略不需要的返回值
    _, z := swap(5, 6)
}

匿名函数与一等公民

Go中函数是一等公民,可以赋值给变量、作为参数传递或从函数返回:

// 赋值给变量
f := func() {
    fmt.Println("匿名函数赋值")
}

// 作为参数
func execute(f func()) {
    f()
}

// 闭包(装饰器模式)
func wrapper(f func()) func() {
    return func() {
        f()
        fmt.Println("额外操作")
    }
}

作用域

  • 局部变量:函数内部声明
  • 全局变量:函数外部声明,同一包内可见
  • 形式参数:函数定义中的参数,作用域仅限于函数体内
var global = 10 // 全局变量

func main() {
    local := 20 // 局部变量
    fmt.Println(global, local)
}

// 注意:同一包内多个文件的顶级作用域不允许重复声明同名变量或函数

类型重命名与别名

type MyFunc func(int, int) int   // 定义新类型
type MyType = int                // 仅别名,与int视为同一类型

// 区别:新类型与原始类型不同,别名则完全相同
func test(a int) {}
var a MyType = 10
test(a) // MyType(别名)可以传入;如果使用type MyType int则不行

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。