jack 3 meses atrás
pai
commit
fa12883b42

+ 3 - 0
.vscode/settings.json

@@ -0,0 +1,3 @@
+{
+    "go.formatTool": "gofmt"
+}

+ 3 - 0
golang-exercises/graphic_studio/go.mod

@@ -0,0 +1,3 @@
+module graphic_studio
+
+go 1.22.2

+ 141 - 0
golang-exercises/graphic_studio/main.go

@@ -0,0 +1,141 @@
+package main
+
+import (
+	"fmt"
+	"math"
+)
+
+/*
+设计一个图形工作室的绘图与处理系统,具体要求如下:
+
+1. 制定绘图标准,要求所有图形都能完成两项基础工作:
+  - 生成绘制说明(返回字符串,描述绘制过程)
+  - 计算占用面积(返回float64类型的面积数值)
+*/
+type Drawer interface {
+	Draw() string
+	Area() float64
+}
+
+/*
+2. 制定扩展处理标准,要求部分图形支持尺寸调整功能:
+   - 按比例缩放(接收一个倍数参数,调整图形的大小)
+*/
+
+type Resizer interface {
+	Scale(factor float64)
+}
+
+/*
+3. 创建3种具体图形:
+   - 圆形:包含半径属性
+   - 矩形:包含长和宽属性
+   - 三角形:包含底边长和高属性
+*/
+
+type Circle struct {
+	Radius float64
+}
+
+type Rectangle struct {
+	Width  float64
+	Height float64
+}
+
+type Triangle struct {
+	Base   float64
+	Height float64
+}
+
+/*
+4. 让所有图形都符合绘图标准:
+   - 绘制说明要体现图形特征,如"绘制圆形(半径:10cm)"
+   - 占用面积要根据各自图形的计算公式得出
+*/
+// 圆形特征
+func (c Circle) Draw() string {
+	return fmt.Sprintf("绘制圆形(半径:%.2fcm)", c.Radius)
+}
+
+// 圆形面积
+func (c Circle) Area() float64 {
+	return math.Pi * c.Radius * c.Radius
+}
+
+// 矩形特征
+func (r Rectangle) Draw() string {
+	return fmt.Sprintf("绘制矩形(长:%.2fcm, 宽:%.2fcm)", r.Width, r.Height)
+}
+
+// 矩形面积
+func (r Rectangle) Area() float64 {
+	return r.Width * r.Height
+}
+
+// 三角形特征
+func (t Triangle) Draw() string {
+	return fmt.Sprintf("绘制三角形(底边:%.2fcm, 高:%.2fcm)", t.Base, t.Height)
+}
+
+// 三角形面积
+func (t Triangle) Area() float64 {
+	return 0.5 * t.Base * t.Height
+}
+
+/*
+5. 让圆形和矩形额外符合扩展处理标准,实现尺寸调整功能(三角形暂不支持缩放)
+*/
+// 圆形缩放
+func (c Circle) Scale(factor float64) {
+	c.Radius *= factor
+}
+
+// 矩形缩放
+func (r Rectangle) Scale(factor float64) {
+	r.Width *= factor
+	r.Height *= factor
+}
+
+// 三角形缩放(不支持)
+
+/*
+6. 编写两个通用处理工具:
+  - 图形信息统计工具:接收符合绘图标准的图形,输出其绘制说明和占用面积
+  - 尺寸调整工具:接收任意图形,检查其是否支持尺寸调整,如果支持则将其放大1.5倍,否则提示"该图形不支持尺寸调整"
+*/
+// 打印图形基础信息
+func PrintInfo(d Drawer) {
+	fmt.Println("基础信息:")
+	fmt.Println("绘图说明:", d.Draw())
+	fmt.Printf("占用面积: %.2f cm²\n", d.Area())
+}
+
+// 缩放 (不支持三角形)
+func Scale(d Drawer, factor float64) {
+	fmt.Println("尺寸调整:")
+	if resizer, ok := d.(Resizer); ok {
+		resizer.Scale(factor)
+		fmt.Printf("已放大 %.2f 倍\n", factor)
+	} else {
+		fmt.Println("该图形不支持尺寸调整")
+	}
+}
+
+/*
+7. 在系统主程序中创建各种图形实例,分别使用上述两个工具进行处理测试
+要求:通过统一的标准对不同图形进行处理,展现相同操作在不同图形上的差异化表现,以及部分图形具有特殊处理能力的特性。
+*/
+func main() {
+	circle := Circle{Radius: 10}
+	rectangle := Rectangle{Width: 10, Height: 20}
+	triangle := Triangle{Base: 10, Height: 20}
+
+	PrintInfo(circle)
+	Scale(circle, 1.5)
+
+	PrintInfo(rectangle)
+	Scale(rectangle, 1.5)
+
+	PrintInfo(triangle)
+	Scale(triangle, 1.5)
+}

+ 3 - 0
golang-exercises/test_spider/go.mod

@@ -0,0 +1,3 @@
+module test_spider
+
+go 1.22.2

+ 57 - 0
golang-exercises/test_spider/main.go

@@ -0,0 +1,57 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"net/http"
+	"sync"
+)
+
+type Downloader interface {
+	Download(url string)
+}
+
+type Task struct{}
+
+func (t *Task) Download(url string) {
+	fmt.Println("Downloading:", url)
+	resp, err := http.Get(url)
+	if err != nil {
+		fmt.Println("Error:", err)
+		return
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != 200 {
+		fmt.Println("Downloaded:", resp.Status)
+		return
+	} else {
+		body, err := io.ReadAll(resp.Body)
+		if err != nil {
+			fmt.Println("Error:", err)
+			return
+		}
+		fmt.Println(string(body))
+	}
+}
+
+func main() {
+	// 多个url
+	urls := []string{
+		"https://www.cnblogs.com/apachecn/p/19074830",
+		"https://www.cnblogs.com/apachecn/p/19074830",
+	}
+
+	wg := sync.WaitGroup{}
+
+	for _, url := range urls {
+		wg.Add(1)
+		go func(url string) {
+			defer wg.Done()
+			t := &Task{}
+			t.Download(url)
+		}(url)
+	}
+
+	wg.Wait()
+	fmt.Println("all tasks done")
+}

BIN
golang-exercises/test_spider/spider