Go 语言入门指南:基础语法3 | 豆包MarsCode AI刷题

42 阅读2分钟

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操作接口,主要包括 ReaderWriter

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 读取文件内容

使用 osbufio 来读取文件内容。

代码如下:

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)
	}
}