Как да напиша собствена функция Sleep, използвайки само 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 .

Във вашия втори пример имате нужда от тип конверсия, тъй като 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, той изпълни заспиването в goroutine (на заден план) и изпълни печата веднага след това. Ако премахнете go, трябва да работи добре. - person user9123; 12.12.2020