GO语言是一种静态类型、编译型的编程语言,由Google开发并于2009年发布。它的设计目标是具有高效、可靠、简洁和可扩展的特性。本篇笔记的目的是介绍GO语言的基础语法和主要特性,并提供了具体的代码示例。
1、注释: GO语言支持两种注释方式:单行注释(//)和多行注释(/* ... */)。注释对代码的可读性和维护都非常重要。下面是注释的示例:
// 这是一个单行注释
/*
这是一个多行注释
可以跨越多行
*/
2、包和导入: 在GO语言中,代码被组织为包(package),每个文件都属于一个包。包可以是自己定义的,也可以是标准库中的预定义包。使用import关键字导入其他包的功能。 比如下列代码中的“Hello World”代码示例,第一行package main代表这个文件属于main包的一部分,main 包也就是程序的入口包。第三行导入了标准库里面的FMT包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。import下面是main函数,main 函数的话里面调用了fmt.Println 输出helloword 要运行这个程序的话,我们就直接go run helloword.go.如果我们想编译成二进制的话,可以在go build来编译。编译完成之后接./helloword就可以运行。在FMT包里面还有很多的函数来做不同的输入输出格式化工作。大家可以在编辑器里面把鼠标悬浮在你的代码上,就可以看到每一个函数的文档。也可以进入pkg.go.dev,后面加你的包名比如FMT然后就能看到这个包的在线文档,可以从里面去挑选你需要的函数来使用。
package main
import "fmt" //导入 fmt 包
func main() {
fmt.Println("Hello, world!") //使用 fmt 包中的 Println 函数
}
3、变量和常量: GO语言是一门静态类型语言,变量需要提前声明并指定类型。 go语言是一门强类型语言 ,每一个变量都有它自己的变量类型。常见的变量类型包括字符串整数浮点型、布尔型等。 go语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。 go语言里面的变量的声明:在go语言里面变量的声明有两种方式,一种是通过 var name string =“ “这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。如果有需要,也可以显示写出变量类型。另一种声明变量的方式是:使用变量冒号:= 等于值。 常量:常量是在编译时就已经确定的值,无法被修改。常量定义时就是把var改成const,值在一提的是go语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
package main
import "fmt"
func main() {
var name string = "John" // 声明一个字符串类型变量
age := 25 // 使用简短声明方式,推断出变量类型为 int
const PI float64 = 3.14159 // 声明一个常量
fmt.Println("My name is", name)
fmt.Println("I am", age, "years old")
fmt.Println("The value of PI is", PI)
}
4、数据类型: GO语言内置了多种基本数据类型,包括整数类型、浮点数类型、布尔类型和字符串类型等。
package main
import "fmt"
func main() {
var num1 int = 10 // 整数类型
var num2 float64 = 3.14 // 浮点数类型
var isTrue bool = true // 布尔类型
var str string = "Hello" // 字符串类型
fmt.Println(num1)
fmt.Println(num2)
fmt.Println(isTrue)
fmt.Println(str)
}
5、控制流程: GO语言提供了多种控制流程语句,如条件语句、循环语句和选择语句等。注意go语言里面的if else写法和C或者C++类似。不同点的第一个是if后面没有括号。如果写括号的话,那么在保存的时候你的编辑器会自动把你去掉。第二个不同点是Golang里面的if,它必须后面接大括号,就不能像C或者C++一样,直接把if里面的语句写在同一行。
package main
import "fmt"
func main() {
num := 10
if num > 0 {
fmt.Println("num is positive")
} else if num < 0 {
fmt.Println("num is negative")
} else {
fmt.Println("num is zero")
}
}
6、循环语句,在GO语言中最常见的循环包括 for 循环,无限循环,大部分格式和C或C++基本类似。但是注意在go里面没有 while 循环、do while循环,只有唯一的一种for循环。最简单的for循环就是在for后面什么都不写,代表死循环。 循环途中你可以用break跳出,也可以使用经典的C循环,就是for i=0,i<N,i++。这中间三段,任何一段都可以省略。另外,在循环里面,你可以用break或者continue来跳出或者继续循环。
package main
import "fmt"
func main() {
// for 循环
for i := 0; i < 5; i++ {
fmt.Println(i)
}
// 无限循环
k := 0
for {
fmt.Println(k)
k++
if k == 5 {
break
}
}
}
7、选择语句,即我们常见的switch语句,用法和C++不同的地方在于满足条件的情况下,完成条件语句后不用进行break操作。相比C或者C++,go语言里面的switch功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的if else语句。你可以在switch后面不加任何的变量,然后在case里面写条件分支。这样代码相比你用多个if else代码逻辑会更为清晰。
package main
import "fmt"
func main() {
num := 2
switch num {
case 1:
fmt.Println("One")
case 2:
fmt.Println("Two")
default:
fmt.Println("Other")
}
}
8、map: 在其他编程语言里面,它可能可以叫做哈希或者字典。map 是实际使用过程中最频繁用到的数据结构。我们跟我们可以用make来创建一个空 map,这里会需要两个类型,第一个是那个key的类型,这里是string另一个是value的类型,这里是int。我们可以从里面去存储或者取出键值对。可以用delete从里面删除键值对。golang的map是完全无序的,遍历的时候不会按照字母顺序,也不会按照插入顺序输出,而是随机顺序。
package main
import (
"fmt"
)
func main() {
// 创建空map
myMap := make(map[string]int)
// 存储键值对
myMap["apple"] = 10
myMap["banana"] = 5
myMap["orange"] = 8
// 打印map的键值对
for key, value := range myMap {
fmt.Println(key, ":", value)
}
// 删除某个键值对
delete(myMap, "banana")
fmt.Println("After deleting 'banana':")
for key, value := range myMap {
fmt.Println(key, ":", value)
}
}
9、结构体: 结构体是带类型的字段的集合,GO语言支持自定义数据类型,结构体是一种用户定义的复合类型,可以包含多个字段。一个结构体变量,构造的时候需要传入每个字段的初始值。也可以用这种键值对的方式去指定初始值,这样可以只对一部分字段进行初始化。同样的结构体我们也能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。
package main
import "fmt"
// 定义结构体
type Person struct {
name string
age int
}
func main() {
// 创建结构体实例
p := Person{
name: "John",
age: 25,
}
fmt.Println(p.name)
fmt.Println(p.age)
}
总结一下,整体来说GO语言和在学习学过的C或者C++比较相似,它们之间也存在许多共同特点,但是一些细节比如包的导入,循环的类型,选择语句的跳出等还是有一些不太一样的,总体来说对于初次接触GO语言的学生来说上手难度和理解难度不算太高,但是还是需要日后的积累代码经验和多实践总结才可以彻底掌握GO语言。本次笔记虽然只是记录了GO语言比较基础的知识点,但是我还是希望可以打好编程学习的知识基础,另外在日后的GO语言学习过程中我希望自己可以多多回顾一下这篇笔记,希望可以通过练习改掉之前的变成问题,早日彻底掌握GO语言。