package main

import (
	"errors"
	"fmt"
	"time"
)

// 模拟一个可能很慢的操作
func slowOperation() (string, error) {
	time.Sleep(3 * time.Second) // 假设真的很慢
	return "slow result", nil
}

func doWithTimeout(timeout time.Duration) (string, error) {
	resultCh := make(chan string, 1)
	errCh := make(chan error, 1)

	go func() {
		res, err := slowOperation()
		if err != nil {
			errCh <- err
			return
		}
		resultCh <- res
	}()

	select {
	case res := <-resultCh:
		return res, nil
	case err := <-errCh:
		return "", err
	case <-time.After(timeout):
		return "", errors.New("操作超时")
	}
}

func main() {
	fmt.Println("开始调用，最大等待 2 秒...")
	res, err := doWithTimeout(2 * time.Second)
	if err != nil {
		fmt.Println("失败:", err)
		return
	}
	fmt.Println("成功:", res)
}
