Как написать свою собственную функцию сна, используя только time.After?

Я пытаюсь написать свою собственную функцию сна, эквивалентную time.Sleep, используя time.After в Go.

Вот код. Первая попытка:

func Sleep(x int) {
  msg := make(chan int)
  msg := <- time.After(time.Second * x)
}

Вторая попытка:

func Sleep(x int) {
 time.After(time.Second * x)
}

Обе возвращают ошибки, может ли кто-нибудь объяснить мне, как написать функцию сна, эквивалентную time.Sleep, используя time.After, и, если возможно, когда мне использовать канал?


person airsoftFreak    schedule 11.08.2015    source источник
comment
взгляните на stackoverflow.com/questions/23582143/, а также stackoverflow.com/questions/16466320/   -  person Richard Chambers    schedule 11.08.2015


Ответы (1)


time.After() возвращает вам канал. И значение будет отправлено на канал после указанной продолжительности.

Поэтому просто получите значение из возвращаемого канала, и получение будет заблокировано до тех пор, пока значение не будет отправлено:

func Sleep(x int) {
    <-time.After(time.Second * time.Duration(x))
}

Ваши ошибки:

В вашем первом примере:

msg := <- time.After(time.Second * x)

msg уже объявлено, поэтому краткое объявление переменной := использовать нельзя. Также полученное значение будет иметь тип time.Time, так что вы даже не сможете назначить его msg .

Во втором примере вам нужен тип conversion, поскольку x имеет тип int, а time.Second имеет тип < a href="https://golang.org/pkg/time/#Duration" rel="nofollow">time.Duration, а time.After() ожидает значение типа time.Duration.

person icza    schedule 11.08.2015
comment
Большое спасибо, icza, ты снова спас меня. У меня так много вопросов по golang. - person airsoftFreak; 11.08.2015
comment
Я не понимаю эту часть ‹-time.After(time.Second * time.Duration(x)) получает? - person airsoftFreak; 11.08.2015
comment
@airsoftFreak time.After() возвращает канал. А <- — это оператор получения, применяемый к возвращаемому значению time.After(). - person icza; 11.08.2015
comment
Может кто-нибудь объяснить, как использовать функцию Sleep(x int) выше? go Sleep(10) с оператором печати после немедленного выполнения, поэтому я знаю, что это не работает для меня. - person Shawn; 20.10.2017
comment
@Shawn 3 года спустя, вот ваш ответ: P - поскольку вы использовали go перед Sleep, он выполнил сон в горутине (в фоновом режиме) и сразу после этого выполнил печать. Если вы удалите go, все должно работать нормально. - person user9123; 12.12.2020