今天学习了go语言,刚开始我认为他是一个全新的语言,会让自己学习起来很痛苦,但是实际上,其实他和其他语言还是很像的。下面是我对于go语言的一些浅显的认知,首先,让我们从Hello World程序开始:
package main
import (
"fmt"
)
func main() {
fmt.Print("hello word")
}
看上去其实和我python和c语言比起其实是不大的,import "fmt" 导入了 fmt 包,使我们能够使用其中的函数。func main() 是程序的入口点,其中的代码会在程序启动时运行。fmt.Print 函数用于打印文本到控制台。
又比如在go语言当中的循环,go当中的循环只有for循环,是没有while和do while的。其代码格式为:
for i := 0; i < 5; i++
{
fmt.print("helle word")
}
要是想实现我们while循环我们可以这样写:将i设定一个值为0,循环条件是i<5,因为i是不会变化的,所以就可以实现while的死循环效果。
i := 0
for i < 5 {
fmt.print("helle word")
}
又比如说我们经常说的切片,切片我们可以认为是一个动态数组,让会在我们进行初始化之后,按内容占用一定的内存,而不是像数组一样直接就给定一个长度值,直接占用那么多内存,同时也可以避免我们出现数组越位和内存节省。go当中的切面实现:
package main
import (
"fmt"
)
func main() {
// 数组的声明和初始化
var myArray [5]int
myArray = [5]int{1, 2, 3, 4, 5}
// 切片的声明和初始化
mySlice := []int{1, 2, 3, 4, 5}
// 访问数组和切片中的元素
fmt.Println(myArray[0])
fmt.Println(mySlice[0])
// 修改切片中的元素
mySlice[0] = 10
fmt.Println(mySlice)//[10 2 3 4 5]
}
但是go与python也有着区别,比如在python当中我们可以直接将num这种整形赋值给字符类型src:
num = 77 str = "The num is: " + str(num)//The num is:77
但是在go语言当中就是不允许,因为go是强类型语言,所以我们需要做一下类型转换使用Itoa:
package main
import (
"fmt"
"strconv"
)
func main() {
num := 123
str := strconv.Itoa(num)
fmt.Println(str) // 输出 "123"
}
还有就是go是一个擅长高并发的语言,这就不得不说一下当中并发,Go原生支持轻量级并发,通过goroutines和channels实现。这使得编写并发程序变得简单,并且能够高效地利用多核处理器。创建goroutiones可以使用go关键字:
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Println("Number:", i)
time.Sleep(100 * time.Millisecond)
}
}
func printLetters() {
for i := 'A'; i <= 'E'; i++ {
fmt.Println("Letter:", string(i))
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go printNumbers()
go printLetters()
// 主程序等待一段时间,以确保goroutines有足够时间执行
time.Sleep(1 * time.Second)
}
Channels是goroutines之间进行通信的一种机制。它可以用于在不同的goroutines之间传递数据,并确保数据同步和并发安全,如何理解这个缓冲通道呢,比如说我们有两个协程,有一个是需要马上执行,但是另一个并不是需要马上执行,或者说后者对于处理需求并非那么强,那么我们就可以使用Chanels给到一定缓冲,减少压力。可以理解为一个是生产者,一个是消费者,当我消费者有需求时,我作为生产者应当及时生产出来,但是我作为消费者可以不那么及时去拿到我需要的东西。在go当中可以通过使用make函数来创建一个channel,然后使用<-操作符来发送和接收数据。
package main
import (
"fmt"
)
func producer(ch chan<- int) {
for i := 1; i <= 5; i++ {
ch <- i // 发送数据到channel
}
close(ch) // 关闭channel
}
func consumer(ch <-chan int) {
for num := range ch {
fmt.Printf("Received: %d\n", num) // 接收channel中的数据
}
}
func main() {
ch := make(chan int) // 创建一个channel
go producer(ch) // 启动生产者Goroutine
go consumer(ch) // 启动消费者Goroutine
// 等待Goroutine执行完成
var input string
fmt.Scanln(&input)
//最后输出:
Received: 1
Received: 2
Received: 3
Received: 4
Received: 5
}