Go语言小例子
编辑:本站更新:2024-12-28 20:46:42人气:3682
在深入探讨 Go 语言的实用性与优雅性时,我们可以通过一系列精心挑选的小例子来揭示其独特的特性和功能。以下是一些富有代表性的Go语言编程实践案例:
1. **并发特性示例**
在Go中,goroutine是轻量级线程的概念实现,并发执行任务非常简便高效。例如:
package main
import (
"fmt"
)
func say(s string) {
for i := 0; ; i++ {
fmt.Println(s)
}
}
func main() {
go say("world") // 创建并启动一个新的 goroutine
say("hello")
}
在这个简单的程序里,“say”函数在一个无限循环内打印字符串,在main函数内部通过关键字`go`创建一个新goroutine运行“say('world')”。主 Goroutine 同样也在进行 `say("hello")` 的输出工作。因此两个函数会同时(或者说并发地)执行。
2. **通道(Channel)** 示例
面向channel的设计使得Goroutines之间的通信变得直观且安全:
package main
import "fmt"
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum // 将结果发送到 channel 'c'
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // 接收来自两个goroutine的结果
fmt.Printf("Sum of first half %d\n", x)
fmt.Printf("Sum of second half %d\n", y)
total := x + y
fmt.Printf("Total Sum is :%d \n",total )
}
此代码片段展示了如何使用 channels 进行数据同步和交换:sum 函数对数组的不同部分求和并将结果分别放入不同的通道;然后主线程从这两个通道接收值以计算整个序列总和。
3. **接口(interface{})** 示例:
package main
type Animal interface {
Speak()
}
type Dog struct{}
func (Dog) Speak() { println("Woof!") }
type Cat struct {}
func (Cat)Speak(){println("Meow!")}
func speak(animal Animal){
animal.Speak()
}
func main(){
dog:=Dog{}
cat:=Cat{}
speak(dog) // 输出 Woof!
speak(cat) // 输出 Meow!
}
这里演示了Go中的接口类型——Animal声明了一个方法SPEAK(),而结构体Dog和Cat都实现了这个方法。这样无论传入的是哪种类型的实例给`speak()`函数,只要它们满足Animal接口的要求就能正确调用相应的方法,体现了面向对象设计原则的同时也保持了静态编译型语言的安全性。
总结来说,上述这些简短的例子有力证明了为何Go语言能在现代软件开发领域广受欢迎的原因—简洁明快、易于理解和高效的并发模型以及强大的抽象能力等特质使其成为构建高性能服务端应用的理想选择之一。然而这只是冰山一角,更深层次的功能如错误处理机制(error handling),反射(reflection), 包管理(package management)等等都有待进一步探索学习。
1. **并发特性示例**
在Go中,goroutine是轻量级线程的概念实现,并发执行任务非常简便高效。例如:
go
package main
import (
"fmt"
)
func say(s string) {
for i := 0; ; i++ {
fmt.Println(s)
}
}
func main() {
go say("world") // 创建并启动一个新的 goroutine
say("hello")
}
在这个简单的程序里,“say”函数在一个无限循环内打印字符串,在main函数内部通过关键字`go`创建一个新goroutine运行“say('world')”。主 Goroutine 同样也在进行 `say("hello")` 的输出工作。因此两个函数会同时(或者说并发地)执行。
2. **通道(Channel)** 示例
面向channel的设计使得Goroutines之间的通信变得直观且安全:
go
package main
import "fmt"
func sum(a []int, c chan int) {
sum := 0
for _, v := range a {
sum += v
}
c <- sum // 将结果发送到 channel 'c'
}
func main() {
a := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(a[:len(a)/2], c)
go sum(a[len(a)/2:], c)
x, y := <-c, <-c // 接收来自两个goroutine的结果
fmt.Printf("Sum of first half %d\n", x)
fmt.Printf("Sum of second half %d\n", y)
total := x + y
fmt.Printf("Total Sum is :%d \n",total )
}
此代码片段展示了如何使用 channels 进行数据同步和交换:sum 函数对数组的不同部分求和并将结果分别放入不同的通道;然后主线程从这两个通道接收值以计算整个序列总和。
3. **接口(interface{})** 示例:
go
package main
type Animal interface {
Speak()
}
type Dog struct{}
func (Dog) Speak() { println("Woof!") }
type Cat struct {}
func (Cat)Speak(){println("Meow!")}
func speak(animal Animal){
animal.Speak()
}
func main(){
dog:=Dog{}
cat:=Cat{}
speak(dog) // 输出 Woof!
speak(cat) // 输出 Meow!
}
这里演示了Go中的接口类型——Animal声明了一个方法SPEAK(),而结构体Dog和Cat都实现了这个方法。这样无论传入的是哪种类型的实例给`speak()`函数,只要它们满足Animal接口的要求就能正确调用相应的方法,体现了面向对象设计原则的同时也保持了静态编译型语言的安全性。
总结来说,上述这些简短的例子有力证明了为何Go语言能在现代软件开发领域广受欢迎的原因—简洁明快、易于理解和高效的并发模型以及强大的抽象能力等特质使其成为构建高性能服务端应用的理想选择之一。然而这只是冰山一角,更深层次的功能如错误处理机制(error handling),反射(reflection), 包管理(package management)等等都有待进一步探索学习。
www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源
PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。