Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题

54 阅读5分钟

Go 语言入门指南:基础语法和常用特性解析

1.安装和配置 Go 环境

  • 下载并安装Go:访问Go官网下载对应操作系统的安装包,并按照指引完成安装。

  • 配置环境变量:确保GOPATHGOROOT环境变量已正确设置。

  • 验证安装:打开命令提示符(CMD)或 PowerShell,输入以下命令:

    go version
    

    系统会显示已安装的 Go 版本。

2.基础语法

1.变量

package main

import "fmt"

func main() {
    // 使用 var 关键字做到自动类型识别
	var a = "hello word"
    // 做到强制类型
	var b int = 1
    // 短变量声明,也会自动识别类型
	c := 3.14
	
	fmt.Println(a, b, c)
}

作为后起语言,golang 肉眼可见的学习了不少过往语言的特性(例如 “var” 关键字,可以做到自动识别类型)

并且不像弱类型的 JavaScript 在业务代码上通常需要注重类型才不至于出现各类抽象错误(以至于微软为此开发了 TypeScript),golang 也提供了强类型的写法,可以有效约束变量

不过值得注意的是,“ := ” 这个写法在 golang 中是可以用于初始化变量的,而非 Python 的海象运算符,仅仅只能在条件赋值时使用

2.判断

package main

import "fmt"

func main() {
	a := 1
	if a % 2 == 1 {
		fmt.Println("1")
	} else {
		fmt.Println("2")
	}
	
    // 先初始化变量,再进行判断
	if b := 2; b < 3 {
		fmt.Println("1")
	} else if b > 3 {
		fmt.Println("2")
	} else {
		fmt.Println("3")
	}
}

与 Java 不同的是,golang 的条件表达式并不需要用括号包裹,但是代码块中的语句则需要用大括号包裹,也就不需要依赖换行来区分了

值得注意的是,golang 允许在 if 中包含一个初始化语句(例如使用 “ := ” 来声明变量),随后进行分号后面语句的判断

3.循环

package main

import "fmt"

func main() {
    // 类似于其他语言的标准写法,但实际上 golang 是按顺序执行 for 后面的语句
	n := 3
	for i := 0; i < n; i++ {
		fmt.Println(i)
	}

    // 仍旧有 continue 和 break 关键字
	for {
		if n <= 5 {
			n++
			continue
		} else {
			break
		}
	}
	
    // 类似于 while 的写法
	m := 1
	for m <= n {
		fmt.Println(m)
		m++
	}
}

不同于大部分语言,golang 并没有设计 while,不过取而代之的是,它将 for 的特性增强了许多,能够按顺序执行 for 后面的语句,可以说更泛用了

4.数组与切片

package main

import "fmt"

func main() {
	var a [5]int
	a[0] = 1
	fmt.Println(a[0], len(a))

    // 初始化时手动赋值
	b := [5]int{1, 2, 3, 4, 5}
	fmt.Println(b)

    // 二维数组
	var c [5][5]int
	for i := 0; i < 5; i++ {
		for j := 0; j < 5; j++ {
			c[i][j] = i + j
		}
	}
	fmt.Println(c)
}

golang 的数组和其他语言并没有太大的区别,也是不可变的

package main

import "fmt"

func main() {
	// 手动初始化指定长度切片
	a := make([]int, 5)
	a[0] = 1
	a[1] = 2
	a[2] = 3

	a = append(a, 6)
	a = append(a, 7, 8, 9)

	// 复制切片(浅拷贝)
	b := make([]int, len(a))
	copy(b, a)

	b[0] = 999
	fmt.Println(a)
	fmt.Println(b)

	// 类似于 python 的特性,可惜不能使用负数
	fmt.Println(b[:2])
	fmt.Println(b[2:5])
	fmt.Println(b[5:])
}

golang 也有可变数组——切片,有很多特性和额外函数,例如我本人非常喜欢的 python 特性,可惜不能使用负数,不然 a[-1] 之类的还是挺常用的

5.map

package main

import "fmt"

func main() {
    // 创建一个 key 是 string, value 是 int 的 map
	a := make(map[string]int)
	a["one"] = 1
	a["two"] = 2
	fmt.Println(a)
	fmt.Println(a["one"])
	
	delete(a, "one")
	
	b := map[int]string {1: "one", 2: "two"}
	fmt.Println(b)
}

类似于 Java 的 map,不过默认实现是和 HashMap 一样的,并没有记录插入顺序,内部是无序的

6.range

package main

func main() {
	a := []int{1, 2, 3}
	b := make([]int, 3)
	for i, v := range a {
		b[i] = i + v
		print("index:", i, "value:", v)
	}
	
	m := map[string]int{"a": 1, "b": 2}
	for k, v := range m {
		print("key:", k, "value:", v)
	}
	
	// 仅获取 key
	for k := range m {
		print("key:", k)
	}
}

和 Python 类似,不过更像 Python 的 enumerate,可以做到拿到下标和值

7.函数

package main

import "fmt"

// 分别指定参数
func add1(a int, b int) int {
	return a + b
}

// 统一指定参数
func add2(a, b float64) float64 {
	return a + b
}

// 多个返回值
func exists(m map[string]int, k string) (v int, ok bool) {
	v, ok = m[k]
	return v, ok
}

func main() {
	fmt.Println(add1(1, 2))
	fmt.Println(add2(3.14, 4.13))

	v, ok := exists(map[string]int{"a": 1}, "A")
	fmt.Println(v, ok)
}

golang 的函数和 Python 类似,采用 "func" 来标识,并且支持多个返回值,不过需要约定参数和返回值的类型

8.指针

package main

import "fmt"

func add(n int) {
	n += 1
}

func addByPtr(n *int) {
	*n += 1
}

func main() {
	n := 1
	add(n)
	fmt.Println(n)

	n = 1
	addByPtr(&n)
	fmt.Println(n)
}

类似于 C/C++ 的指针,可以做到指针传递,从而做到任何通过指针对变量的修改都能反映到原始变量上

9.结构体与结构体方法

package main

import "fmt"

type user struct {
	name     string
	password string
}

func main() {

	a := user{name: "jack", password: "123456"}

	b := user{"john", "654321"}

	c := user{}
	c.name = "jojo"
	c.password = "123456"

	fmt.Println(a, b, c)
	fmt.Println(c.name)
	fmt.Println(c.password)
}

类似于 C++ 的结构体,有多种初始化方式

package main

import "fmt"

type user struct {
	name     string
	password string
}

func (u user) checkPassword(password string) bool {
	return u.password == password
}

func (u *user) resetPassword(newPassword string) {
	u.password = newPassword
}

func main() {
	a := user{name: "jack", password: "123456"}
	fmt.Println(a.checkPassword("654321"))
	a.resetPassword("654321")
	fmt.Println(a.checkPassword("654321"))
}

通过指针的写法,可以做到对结构体的修改

3.总结

作为比较新的语言,golang 很好的结合了老牌编程语言的各类优良特性,目前也在各类领域发挥自己的特性。通过学习 golang 语言,能让我们掌握一种高效、简洁且功能强大的编程工具,将有助于提升你的技术能力,拓展职业机会,并深入参与现代软件架构的开发。