Нужно ли везде использовать TypeScript?
или это хайп?
Есть ли смысл использовать Typescript в пет проектах?
типа создал мини игру 15 строчках кода на TypeScript?
Или он только в крупных проектах нужен? и вообще все прям без него будто не могут писать судя по отзывам или это какойто хайп или реклама Microsoft
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func main() {
runtime.GOMAXPROCS(8)
arr := []int{1343434, 1343434300, 234343400, 334343434000, 400434340, 203434340, 4232, 23545, 15535, 353535, 33434434, 5334345, 3533434345, 3535}
for idx, el := range arr {
wg.Add(1)
go test(el, idx)
}
wg.Wait()
}
func test(el int, idx int) {
fmt.Printf("%d started: %d\n", idx, el)
for i := 0; i < el; i++ {
el = el - 1
}
fmt.Printf("%d completed: %d\n", idx, el)
defer wg.Done()
}
4 started: 400434340
8 started: 15535
8 completed: 7767
13 started: 3535
13 completed: 1767
6 started: 4232
6 completed: 2116
10 started: 33434434
3 started: 334343434000
7 started: 23545
7 completed: 11772
5 started: 203434340
12 started: 3533434345
11 started: 5334345
2 started: 234343400
1 started: 1343434300
11 completed: 2667172
9 started: 353535
9 completed: 176767
0 started: 1343434
0 completed: 671717
10 completed: 16717217
5 completed: 101717170
4 completed: 200217170
2 completed: 117171700
1 completed: 671717150
12 completed: 1766717172
arr := []int{1343434, 1343434300, 234343400, 334343434000, 334343434000, 334343434000, 4232, 23545, 15535, 353535, 33434434, 5334345, 3533434345, 3535}
%Cpu0 : 0.3 us, 1.0 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 1.7 us, 0.7 sy, 0.0 ni, 97.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 1.6 us, 2.9 sy, 0.0 ni, 95.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu4 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu5 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu6 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu7 : 5.6 us, 1.0 sy, 0.0 ni, 93.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
wRecorder := httptest.NewRecorder()
next.ServeHTTP(wRecorder, r)
resp := wRecorder.Result()
body, _ := io.ReadAll(resp.Body)
// не забыть записать ответ в w
}
return http.HandlerFunc(fn)
}
func (m *LoggingMiddleware) LogBody(next http.Handler) http.Handler {
fn := func(w http.ResponseWriter, r *http.Request) {
var buf bytes.Buffer
logWriter := NewLogToConsoleResponseWriter(&b)
next.ServeHTTP(logWriter, r)
// тут у вас в buf будет ответ сервера, с которым можно работать
// главное потом не забыть записать его в `w`
}
return http.HandlerFunc(fn)
}
package main
import (
"fmt"
"io/ioutil"
"gopkg.in/yaml.v3"
)
func main() {
fmt.Println("start")
c, err := readYaml("./tets.yml")
if err != nil {
panic(err.Error())
}
fmt.Println(c.Master, c.Kibana, c.Data, c.Pass, c.User)
}
type ClusterEnv struct {
Master []string `yaml:"master,flow"`
Data []string `yaml:"data,flow"`
Kibana []string `yaml:"kibana,flow"`
User string `yaml:"user"`
Pass string `yaml:"pass"`
}
func readYaml(filename string) (*ClusterEnv, error) {
buf, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
c := &ClusterEnv{}
err = yaml.Unmarshal(buf, c)
if err != nil {
return nil, fmt.Errorf("in file %q: %v", filename, err)
}
return c, nil
}
...
) оператора), и оптимизатор знает об этом сахаре. У Map есть только его методы, с которыми оптимизатор может сделать не так уж и много (так как некоторые оптимизации не применимы к динамическому диспатчингу, ибо ведут к UB, а JS - язык с гарантированным отсутствием UB) type BigStruct struct {
field1 int
filed2 string
field3 uint
field4 []byte
...
field50 string
}
func Report(s BigStruct)
s := BigStruct{}
// заполняем поля
Report(s)
func Report(s *BigStruct)
s := BigStruct{}
// заполняем поля
Report(&s) // тут добавился & - берём адрес структуры, а не саму структуру
// создаём переменную s сразу с типом указатель на BigStruct
s := &BigStruct{}
// заполняем поля
Report(s) // поскольку s уже является указателем - & тут не нужен
var s *BigStruct
var i *int
i = new(int)
*i = 10 // пишем значение
fmt.Printf("i: %v\n", i)
fmt.Printf("*i: %v\n", *i)
i: 0xc0000160d8 (это адрес памяти, где лежит значение переменной i)
*i: 10 (а это её значение)
const containerSelector = '.block-btn';
const itemSelector = `${containerSelector} [data-cost]`;
const activeClass = 'active';
const onClick = ({ currentTarget: t }) => t
.closest(containerSelector)
.querySelectorAll(itemSelector)
.forEach(n => n.classList.toggle(activeClass, n === t));
document.querySelectorAll(itemSelector).forEach(n => {
n.addEventListener('click', onClick);
});
for (const n of document.querySelectorAll(containerSelector)) {
n.addEventListener('click', onClick);
}
function onClick(e) {
const item = e.target.closest(itemSelector);
if (item) {
this.querySelector(`.${activeClass}`)?.classList.remove(activeClass);
item.classList.add(activeClass);
}
}
document.addEventListener('click', ({ target: t }) => t
.closest(itemSelector)
?.closest(containerSelector)
.querySelectorAll(itemSelector)
.forEach(n => n.classList.toggle(activeClass, n.contains(t)))
);
const date = new Date(str.replace(/\S+/, m => m.split('.').reverse().join('-')));
const date = new Date(str.replace(/(\d+)\.(\d+)\.(\d+)/, '$3-$2-$1'));
const [ day, month, year, hours, minutes, seconds ] = str.split(/\D/);
const date = new Date(year, month - 1, day, hours, minutes, seconds);
const date = dayjs(str, 'DD.MM.YYYY HH:mm:ss').toDate();
Func.prototype.printName = function(){
console.log(this.name)
}
a.printName() // выведет в консоль Victoria