Skip to content

Commit

Permalink
add chapters 2, 3 of golang course
Browse files Browse the repository at this point in the history
* add chapters 2, 3 of golang course (without tests)
* cosmetic fix of golang chapter 1
* add tests for task 1 of chapter 1
  • Loading branch information
korepanov authored Feb 12, 2024
1 parent 0170e84 commit 00fc71a
Show file tree
Hide file tree
Showing 6 changed files with 573 additions and 24 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.vscode
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
#INJECT-b585472fa
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package main

import (
"bytes"
"io"
"os"
"strings"
"testing"
)

func TestSwap(t *testing.T) {
cases := []struct {
firstString, secondString string
}{
{"val1", "val2"},
{"val1", "val1"},
{"", ""},
}

for _, c := range cases {
oldFirst := c.firstString
oldSecond := c.secondString

swap(&c.firstString, &c.secondString)

if oldFirst != c.secondString || oldSecond != c.firstString {
t.Errorf("swap(&s, &s2) when s = %q and s2 = %q made s = %q and s2 = %q, wants s = %q and s2 = %q",
oldFirst, oldSecond, c.firstString, c.secondString, oldSecond, oldFirst)
}
}
}

func TestMain(t *testing.T) {
old := os.Stdout // keep backup of the real stdout
r, w, _ := os.Pipe()
os.Stdout = w

outC := make(chan string)
// copy the output in a separate goroutine so printing can't block indefinitely
go func() {
var buf bytes.Buffer
io.Copy(&buf, r)
outC <- buf.String()
}()

main()

// back to normal state
w.Close()
os.Stdout = old // restoring the real stdout
out := <-outC

// reading our temp stdout
if strings.TrimSpace(out) != "Hello, gophers!" {
t.Fatalf("main() prints \"" + strings.TrimSpace(out) + "\", not \"Hello, gophers!\"")
}

}
50 changes: 26 additions & 24 deletions golang/golang_chapter_0010/text.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# Глава 1
## Введение
# Глава 1. Введение
Язык [Go](https://ru.wikipedia.org/wiki/Go) — компилируемый многопоточный язык программирования, разрабатываемый внутри компании Google с 2007 года. Непосредственным проектированием занимались Роберт Гризмер, Роб Пайк и Кен Томпсон. Официально язык представлен в ноябре 2009 года. Поддержка официального компилятора предоставляется для многих операционных систем, в том числе для Windows, Linux и macOS. Язык имеет свою философию, основанную на минималистичности языковых средств и необходимости обработки ошибок по месту их возникновения.

Цель данного курса — познакомить читателя с языком Go на достаточном уровне, чтобы иметь твердую базу для уверенного использования языка.
Expand Down Expand Up @@ -28,13 +27,13 @@
Цель данного раздела — вводное знакомство с языком с тем, чтобы потом рассмотреть многие его частности более подробно. Итак, поехали! Вот, как выглядит hello world на языке Go:

```golang
package main // имя текущего пакета
package main // имя текущего пакета

import "fmt" // импортируемый пакет fmt
import "fmt" // импортируемый пакет fmt

func main() { // точка вход в программу
fmt.Println("Hello world!")
}
func main() { // точка вход в программу
fmt.Println("Hello world!")
}
```

Первая строка программы — имя текущего пакета. Каждая программа на языке Go состоит из множества файлов, объединяемых в так называемые пакеты. Главный пакет называется `main`, также, как функция определяющая точку входа в программу. После директивы import идет список пакетов, которые необходимо включить. В данном случае мы включили пакет `fmt`, чтобы использовать функцию `Println()` из него, которая печатает на экран текст и делает перенос на следующую строку. Текст после символов слешей `//` является однострочным комментарием и игнорируется компилятором. Многострочные комментарии также, как и в языке C, выделяются следующим образом:
Expand Down Expand Up @@ -122,39 +121,42 @@ package main
import "fmt"

func swap(p *string, p2 *string) {
// ваш код здесь
// ваш код здесь
}

func main() {
var s string
var s2 string
var s string
var s2 string

s = ", gophers!"
s2 = "Hello"
s = ", gophers!"
s2 = "Hello"

swap(&s, &s2)
fmt.Println(s + s2)
swap(&s, &s2)
fmt.Println(s + s2)
}
```
``` {.task_hint}

Для обмена местами значений двух переменных между собой используйте третью переменную. {.task_hint}

``` golang {.task_answer}
package main
import "fmt"

func swap(p *string, p2 *string) {
var s = *p
*p = *p2
*p2 = s
var s = *p
*p = *p2
*p2 = s
}

func main() {
var s string
var s2 string
var s string
var s2 string

s = ", gophers!"
s2 = "Hello"
s = ", gophers!"
s2 = "Hello"

swap(&s, &s2)
fmt.Println(s + s2)
swap(&s, &s2)
fmt.Println(s + s2)
}
```

Expand Down
Loading

0 comments on commit 00fc71a

Please sign in to comment.