package main
import (
"bufio"
"os/exec"
)
func main() {
lines := read()
for line := range lines {
print(line)
}
}
func read() <-chan string {
lines := make(chan string)
go func() {
defer close(lines)
child := exec.Command("python", "-u", "./test.py")
stdout, err := child.StdoutPipe()
if err != nil {
return
}
err = child.Start()
if err != nil {
return
}
println("Started")
reader := bufio.NewReader(stdout)
for {
line, err := reader.ReadString('\n')
if err != nil {
break
}
lines <- line
}
err = child.Wait()
if err != nil {
println(err)
}
}()
return lines
}
Loop:
for {
...
if count == 10 {
break Loop
}
...
}
log.Println("quit")
perftracing = append(perftracing, 0)
при исчерпании выделенной памяти выделяет новый блок памяти (по-моему удвоенного размера) и копирует текущие элементы в новый блок. Соответственно часть (половина) горутин пишет по старым адресам, а в выхлопе данные из последнего выделенного блока памяти....
0 0 0 0 5197273 5671085 5177800 5797080
0 0 0 0 5197332 5671147 5177908 5797137
0 0 0 0 5197388 5671208 5178008 5797195
0 0 0 0 5197450 5671269 5178118 5797248
...
threads := 4
perftracing := make([]int64, threads)
for i := 0; i < threads; i++ {
go thread(&perftracing[i])
time.Sleep(1)
}
...
5593758 7107822 5575001 6449763 6321574 5535152 5728000 7196092
5593813 7107884 5575056 6449859 6321628 5535209 5728060 7196153
5593879 7107959 5575122 6449976 6321695 5535275 5728122 7196217
5593936 7108030 5575180 6450079 6321757 5535339 5728190 7196285
...
5594008 7108109 5575251 6450199 6321821 5535403 5728251 7196349
time.Sleep(1)
вы наверно имели в виду что-то типа time.Sleep(time.Second * 1)
package main
import (
"fmt"
"regexp"
)
func main() {
text := "something, something1, othersomething"
fmt.Println("some", createWordRegex("some").MatchString(text))
fmt.Println("thing", createWordRegex("thing").MatchString(text))
fmt.Println("something", createWordRegex("something").MatchString(text))
fmt.Println("something1", createWordRegex("something1").MatchString(text))
}
func createWordRegex(word string) *regexp.Regexp {
return regexp.MustCompile(`\b` + regexp.QuoteMeta(word) + `\b`)
}
Есть тест, который тестирует умножение 5 на 5 и я хочу проверить что возвращается именно 25
func (m multiplier) Calculate(num int, times int) int
, то мок вам не нужен - тестируйте этот метод без всяких моков.func CalculateFiveTimesFive(m Multiplier) int
, то должны проверить в тесте, что она возвращает. При этом мок не обязан возвращать именно 25, а может вернуть любое число. По сути вы проверяете, что функция CalculateFiveTimesFive
всегда возвращает результат вызова метода Calculate
- такой тест выглядит довольно бесполезным (как и сама функция CalculateFiveTimesFive
).m.On("Calculate", 5, 5).Return(37)
assert.Equal(t, 37, multiplier.CalculateFiveTimesFive(m))
m.AssertExpectations(t)
package main
import (
"fmt"
)
func main() {
arguments := make(chan int)
done := make(chan struct{})
result := calculator(arguments, done)
for i := 0; i < 10; i++ {
arguments <- 1
}
close(done)
fmt.Println(<-result)
}
func calculator(arguments <-chan int, done <-chan struct{}) <-chan int {
output := make(chan int)
go func(output chan int) {
defer close(output)
var x int
Loop:
for {
select { // Оператор select
case arg, ok := <-arguments: // Ждет, когда проснется гофер
if !ok {
break Loop
}
x += arg
fmt.Println(x)
case <-done: // Ждет окончания времени
break Loop
}
}
output <- x
}(output)
return output
}
появляется задержка в начале работы
- не понял, что за задержка. Поясните по возможностиstatus_Ch := <-myChan
для закрытого канала будет возвращать zero-значание (в данном случае 0) и цикл никогда не завершится. Проще всего переделать на for status_Ch := range myChan
var testStatus = 200 // Тест-статус результата (меняется непредсказуемо с каждой итерацией цикла): 100 - успешно; 200 - неудачно.
- вроде testStatus
нигде не меняется go1.10.7
text = '' * maximum + text
выглядит бесполезной - для чего пустую строку пытаться реплицировать?...
wxxyyzz0011223344556677889900
xxyyzz0011223344556677889900
xyyzz0011223344556677889900
yyzz0011223344556677889900
yzz0011223344556677889900
zz0011223344556677889900
z0011223344556677889900
0011223344556677889900
011223344556677889900
11223344556677889900
1223344556677889900
223344556677889900
23344556677889900
3344556677889900
344556677889900
44556677889900
4556677889900
556677889900
56677889900
6677889900
677889900
77889900
7889900
889900
89900
9900
900
00
0
package main
func main() {
text := "aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz0011223344556677889900"
show(text, 30)
}
func show(text string, maximum int) {
for i := range text {
if i+maximum < len(text) {
println(text[i : i+maximum])
} else {
println(text[i:])
}
}
}
package config
import (
"encoding/json"
"fmt"
"os"
)
type Cfg struct {
// Fields
}
var (
cfg *Cfg
)
func Config() *Cfg {
return cfg
}
func LoadConfig() error {
f, err := os.Open("./config/config.json")
if err != nil {
return fmt.Errorf("can't open config file: %w", err)
}
defer f.Close()
dec := json.NewDecoder(f)
var c *Cfg
if err := dec.Decode(c); err != nil {
return fmt.Errorf("can't decode config file: %w", err)
}
if err := validate(c); err != nil {
return fmt.Errorf("can't validate config file: %w", err)
}
cfg = c
return nil
}
func validate(cfg *Cfg) error {
// Logic
return nil
}
db.SetMaxOpenConns(1)