Ответ на «Отформатируйте строку без ее вывода»
Легче всего это сделать с помощью
Например:
Легче всего это сделать с помощью
fmt.Sprintf()
, которая возвращает строку, не выводя ее на экран.Например:
package main#задача
import "fmt"
func main() {
s := fmt.Sprintf("Size: %d MB.", 85)
fmt.Println(s)
}
🤮17👏12😁4👎2👍1
Задача. Сумма квадратов
Реализуйте функцию
Например, ввод
В качестве отправной точки можно взять этот код:
#задача
Реализуйте функцию
SumOfSquares
, получающую целое число c
и возвращающую сумму всех квадратов между 1 и c
. Вам потребуется использовать инструкции select
, горутины и каналы.Например, ввод
5
приведет к возвращению 55
, потому что $1² + 2² + 3² + 4² + 5² = 55$
.В качестве отправной точки можно взять этот код:
package mainКод с решением будет завтра.
import "fmt"
func SumOfSquares(c, quit chan int) {
// ваш код
}
func main() {
mychannel := make(chan int)
quitchannel:= make(chan int)
sum:= 0
go func() {
for i := 0; i < 6; i++ {
sum += <-mychannel
}
fmt.Println(sum)
}()
SumOfSquares(mychannel, quitchannel)
}
#задача
👎9🔥3👍1
Ответ на «Сумма квадратов»
•
•
#задача
package mainРассмотрим функцию
import "fmt"
func SumOfSquares(c, quit chan int) {
y := 1
for {
select {
case c <- (y*y):
y++
case <-quit:
return
}
}
}
func main() {
mychannel := make(chan int)
quitchannel:= make(chan int)
sum:= 0
go func() {
for i := 1; i <= 5; i++ {
sum += <-mychannel
}
fmt.Println(sum)
quitchannel <- 0
}()
SumOfSquares(mychannel, quitchannel)
}
SumOfSquares
. Сначала на строке 4 мы объявляем переменную y
, после чего переходим к циклу For-Select
. В инструкциях select
прописано два кейса.•
case c <- (y*y):
служит для отправки квадрата y
по каналу c
, который принимается в горутине, созданной в основной рутине.•
case <-quit:
служит для получения сообщения из основной рутины, которое вернется из функции.#задача
👍7🔥3
🔥5👍2
Задача. Merge sort
Реализуйте конкурентное решение
В качестве опорной точки можно взять эту последовательную реализацию:
#задача
Реализуйте конкурентное решение
merge sort
(сортировка слиянием), используя горутины и каналы.В качестве опорной точки можно взять эту последовательную реализацию:
package mainКод с решением будет завтра.
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int) [] int {
if len(data) <= 1 {
return data
}
mid := len(data)/2
left := MergeSort(data[:mid])
right := MergeSort(data[mid:])
return Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
fmt.Printf("%v\n%v\n", data, MergeSort(data))
}
#задача
👍8🐳7
Ответ на «Merge sort»
Теперь нужно сделать так, чтобы
Операция
#задача
package mainВ начале при сортировке слиянием мы рекурсивно разделяем массив на
import "fmt"
func Merge(left, right [] int) [] int{
merged := make([] int, 0, len(left) + len(right))
for len(left) > 0 || len(right) > 0{
if len(left) == 0 {
return append(merged,right...)
}else if len(right) == 0 {
return append(merged,left...)
}else if left[0] < right[0] {
merged = append(merged, left[0])
left = left[1:]
}else{
merged = append(merged, right [0])
right = right[1:]
}
}
return merged
}
func MergeSort(data [] int) [] int {
if len(data) <= 1 {
return data
}
done := make(chan bool)
mid := len(data)/2
var left [] int
go func(){
left = MergeSort(data[:mid])
done <- true
}()
right := MergeSort(data[mid:])
<-done
return Merge(left,right)
}
func main(){
data := [] int{9,4,3,6,1,2,10,5,7,8}
fmt.Printf("%v\n%v\n", data, MergeSort(data))
}
right
и left
стороны и на строках 30-34 вызываем MergeSort
для обеих сторон.Теперь нужно сделать так, чтобы
Merge(left, right)
выполнялась после получения возвращаемых значений от обоих рекурсивных вызовов, то есть и left
и right
должны обновляться до того, как Merge(left, right)
сможет быть выполнена. Для этого на строке 26 мы вводим канал типа bool
и отправляем в него true
сразу после выполнения left = MergeSort(data[:mid]
(строка 32).Операция
<-done
блокирует код на строке 35 до инструкции Merge(left,right)
, чтобы она не продолжилась, пока горутина не завершится. После завершения горутины и получения true
в канале done
код переходит к инструкции Merge(left, right)
на строке 36.#задача
👍8❤🔥2🤯2🔥1
🔥8👍2👎1🤯1
Forwarded from 🤟 TechRocks: Тестирование QA
🔥6👏2😱2👍1👎1😁1
Может ли функция Go быть создана на лету и использоваться в качестве значений?
Anonymous Quiz
88%
Да
12%
Нет
👍4
Что из следующего не является булевым типом в Go?
Anonymous Quiz
3%
true
2%
false
78%
0
17%
Все вышеперечисленное.
👎5👍4😁2🍾2👏1
Что из следующего верно в отношении выражения lvalue в Go?
Anonymous Quiz
30%
Выражения, которые относятся к ячейке памяти, называются выражениями «lvalue».
11%
Значение lvalue может отображаться как в левой, так и в правой части задания.
25%
Переменные являются lvalues и поэтому могут отображаться в левой части задания.
34%
Все вышеперечисленное.
🤡15👍6
Какой вариант объявления переменной не скомпилируется?
Anonymous Quiz
18%
var p = 99
61%
var p := 99
7%
p := 99
14%
все варианты скомпилируются
👌7👍1
Ответ на «Какие есть способы достать данные из JSON?»
Тут можно либо демаршализовать (
Для всего этого используется
Тут можно либо демаршализовать (
Unmarshal
) JSON и разлить его данные в объект с фиксированной структурой. Либо можно залить данные в пустой интерфейс.Для всего этого используется
json.Unmarshal()
👍13😁6👏1
Ответ на «Что такое горутины и зачем они нужны?»
Горутина (
Они нужны, если нам параллельно требуется сделать несколько действий. Например, ваш скрипт должен опросить множество сторонних сервисов и поработать с ответом. А что делать, если некоторые из сервисов долго отвечают? Как говорится, семеро одного не ждут! Каждому по горутине, и тогда не придется ждать «отстающих».
Горутина (
goroutine
) — это функция, которая выполняется асинхронно. Чтобы запустить горутину нужно лишь написать что-то вроде этого:go someFunc(args…) {Весит одна горутина около 4кб. Так что, если у вас 4ГБ оперативной памяти, то можно одновременно запустить немало горутин 🙂
//тут действия
}()
Они нужны, если нам параллельно требуется сделать несколько действий. Например, ваш скрипт должен опросить множество сторонних сервисов и поработать с ответом. А что делать, если некоторые из сервисов долго отвечают? Как говорится, семеро одного не ждут! Каждому по горутине, и тогда не придется ждать «отстающих».
👍27
Что из следующего верно для инструкции цикла в Go?
Anonymous Quiz
19%
если условие доступно, то цикл выполняется до тех пор, пока условие истинно.
6%
если диапазон доступен, то для цикла выполняется для каждого элемента в диапазоне.
73%
оба вышеупомянутых.
2%
ни один из вышеперечисленных.
Ответ на «Расскажите об ООП в Golang»
Формально оно в Go есть, но не совсем в том виде, в каком оно есть в PHP или Java.
В Go мы создаем структуры (читайте «классы») с определенными полями (свойствами), и далее создаем «экземпляры» этих структур. Методы описываются отдельно, а не внутри структур.
Формально оно в Go есть, но не совсем в том виде, в каком оно есть в PHP или Java.
В Go мы создаем структуры (читайте «классы») с определенными полями (свойствами), и далее создаем «экземпляры» этих структур. Методы описываются отдельно, а не внутри структур.
👎25👍4