Go 语言入门指南:基础语法和常用特性解析
1.安装和配置 Go 环境
-
下载并安装Go:访问Go官网下载对应操作系统的安装包,并按照指引完成安装。
-
配置环境变量:确保
GOPATH和GOROOT环境变量已正确设置。 -
验证安装:打开命令提示符(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 语言,能让我们掌握一种高效、简洁且功能强大的编程工具,将有助于提升你的技术能力,拓展职业机会,并深入参与现代软件架构的开发。