Go 语言入门指南:基础语法3
1. 接口
在Go语言中,接口是一种抽象类型,它定义了一组方法的集合。任何实现了这些方法的类型都被视为实现了该接口。接口使得代码更加灵活和可扩展。
1.1 为什么要使用接口
示例如下:
package main
import "fmt"
// 定义接口
type Animal interface {
Speak() string
}
// 实现接口的类型
type Cat struct{}
type Dog struct{}
func (c Cat) Speak() string { return "喵喵喵" }
func (d Dog) Speak() string { return "汪汪汪" }
func main() {
var a Animal
a = Cat{}
fmt.Println("猫:", a.Speak())
a = Dog{}
fmt.Println("狗:", a.Speak())
}
这个示例使用 Animal 接口定义了动物的行为(发声),而不关心具体的动物类型。并且如果将来需要添加新的动物类型(例如 Bird),只需实现 Animal 接口,而不需要修改现有的代码,更加易于代码的测试和维护。
1.2 空接口
空接口 interface{} 可以接受任何类型的值。当你不知道将要处理的数据类型时,可以使用空接口来编写通用的函数。
代码如下:
package main
import "fmt"
func PrintType(value interface{}) {
fmt.Printf("类型: %T, 值: %v\n", value, value)
}
func main() {
PrintType("Hello, World!")
PrintType(42)
PrintType(true)
}
// 类型: string, 值: Hello, World!
// 类型: int, 值: 42
// 类型: bool, 值: true
2. I/O 操作
Go语言的标准库提供了强大的I/O操作接口,主要包括 Reader 和 Writer。
2.1 Reader 接口
Reader 接口用于读取数据,必须实现 Read(p []byte) (n int, err error) 方法。
代码如下:
package main
import (
"fmt"
"io"
"strings"
)
func main() {
reader := strings.NewReader("Hello, Go!")
buf := make([]byte, 4)
for {
n, err := reader.Read(buf)
if err == io.EOF {
break
}
fmt.Printf("读取到的字节数: %d, 内容: %s\n", n, string(buf[:n]))
}
}
2.2 Writer 接口
Writer 接口用于写入数据,必须实现 Write(p []byte) (n int, err error) 方法。
代码如下:
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.Create("output.txt")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
file.WriteString("Hello, Go!\n")
file.Write([]byte("写入数据到文件\n"))
}
2.3 使用 bufio 进行缓冲 I/O
bufio 包提供了带缓冲的读写功能,可以提高I/O效率。
代码如下:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Create("buffered_output.txt")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
writer := bufio.NewWriter(file)
writer.WriteString("使用 bufio 写入数据\n")
writer.Flush() // 刷新缓冲区
}
2.4 读取文件内容
使用 os 和 bufio 来读取文件内容。
代码如下:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("buffered_output.txt")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("读取文件时出错:", err)
}
}