一、Golang的并发优势
1.1 Goroutine
package main
import (
"fmt"
"sync"
)
func processImage(imageURL string, wg *sync.WaitGroup) {
defer wg.Done()
// 处理图片逻辑...
fmt.Printf("处理图片:%s\n", imageURL)
}
func main() {
var wg sync.WaitGroup
urls := []string{"image1.jpg", "image2.jpg", "image3.jpg"}
for _, url := range urls {
wg.Add(1)
go processImage(url, &wg)
}
wg.Wait()
}
1.2 Channel
package main
import (
"fmt"
"sync"
)
func processImage(imageURL string, ch chan<- string) {
// 处理图片逻辑...
ch <- imageURL
}
func main() {
ch := make(chan string, 3)
var wg sync.WaitGroup
urls := []string{"image1.jpg", "image2.jpg", "image3.jpg"}
for _, url := range urls {
wg.Add(1)
go func(imageURL string) {
defer wg.Done()
processImage(imageURL, ch)
}(url)
}
go func() {
wg.Wait()
close(ch)
}()
for img := range ch {
fmt.Printf("返回图片:%s\n", img)
}
}
二、图片存储与读取
2.1 使用本地文件存储
package main
import (
"fmt"
"io/ioutil"
"os"
)
func readImageFromFile(imagePath string) ([]byte, error) {
data, err := ioutil.ReadFile(imagePath)
if err != nil {
return nil, err
}
return data, nil
}
func main() {
imagePath := "image.jpg"
data, err := readImageFromFile(imagePath)
if err != nil {
fmt.Println("读取图片失败:", err)
return
}
fmt.Println("图片数据读取成功")
}
2.2 使用数据库存储
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql"
)
func insertImage(db *sql.DB, imagePath string) error {
stmt, err := db.Prepare("INSERT INTO images (path) VALUES (?)")
if err != nil {
return err
}
defer stmt.Close()
_, err = stmt.Exec(imagePath)
if err != nil {
return err
}
return nil
}
func main() {
db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
fmt.Println("连接数据库失败:", err)
return
}
defer db.Close()
imagePath := "image.jpg"
err = insertImage(db, imagePath)
if err != nil {
fmt.Println("插入图片失败:", err)
return
}
fmt.Println("图片插入成功")
}
三、图片处理与返回
3.1 使用HTTP响应返回
”`go package main
import (
"fmt"
"io/ioutil"
"net/http"
)
imagePath := "image.jpg"
data, err := ioutil.ReadFile(imagePath)
if err != nil {
http.Error(w, "图片读取失败