37.1K subscribers
1.46K photos
34 videos
5 files
1.62K links
加入频道
Вызов функций 👣 из 🖥

Недавно предо мной встала задача вызова функций Go из C#. В этом посте я решил поделиться простыми примерами кода, которые возможно вам пригодятся.
Для этого я сгенерировал файл Go dll и вызывал его из C#.

Вызов со значениями int

[C#] CallSample.cs
using System.Runtime.InteropServices;

namespace CallDllSample;

public class CallSample
{
[DllImport("dllsample")]
private static extern int CallInt(int num);

public int CallGoInt(int num)
{
return CallInt(num);
}
}


[Go] main.go
package main

import "C"

func main() { }

// publish functions by "//export ~"
//export CallInt
func CallInt(num int) int {
return num + 3
}


🗂Создайте файл dll

go build -buildmode=c-shared -o dllsample.dll .

📢Вызов со строковыми значениями

Поскольку строковый тип C# и строковый тип Go несовместимы, мы получим исключение.

[C#] CallSample.cs
...
[DllImport("dllsample")]
private static extern string CallString(string text);
...
public string CallGoString(string text)
{
return CallString(text);
}
}


[Go] main.go
...

func CallString(text string) string {
return fmt.Sprintf("%s World!", text)
}


Результат
Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Чтобы решить эту проблему, нужно использовать “C.char”.

[C#] CallSample.cs
...
[DllImport("dllsample")]
private static extern IntPtr CallString(string text);
...
public string CallGoString(string text)
{
var result = CallString(text);
Console.WriteLine(result);
return Marshal.PtrToStringAnsi(result) ?? "";
}
}


[Go] main.go
...
//export CallString
func CallString(text *C.char) *C.char {
gs := C.GoString(text)
return C.CString(fmt.Sprintf("%s World!", gs))
}


📢Вызов с помощью массивов

Чтобы отправить массив int в функцию Go, нужно преобразовать его в IntPtr.
А чтобы получить массив int из функции Go, нужно преобразовать его из IntPtr.

[C#] CallSample.cs
...
public void CallGoArray()
{
// Convert from C# int array to IntPtr
var nums = new int[]{ 4, 2, 5, 8 };
IntPtr intPtr = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(int)) * nums.Length);
Marshal.Copy(nums, 0, intPtr, nums.Length);
var pointerResult = CallArray(intPtr, nums.Length);

// Convert from IntPtr to C# int array
var results = new int[nums.Length];
Marshal.Copy(pointerResult, results, 0, results.Length);

for(var i = 0; i < results.Length; i++)
{
Console.WriteLine($"From Go Index: {i} Value: {results[i]}");
}
}
...


[Go] main.go

...
//export CallArray
func CallArray(values *C.int, length C.int) *C.int {
// Convert from C int array to Go int array
cInts := (*[1 << 30]C.int)(unsafe.Pointer(values))[:length:length]

goResults := make([]int, int(length))
for i, v := range cInts {
goResults[i] = int(v)
log.Printf("From C# Index: %d Value: %d", int(i), int(v))
}
// Convert from Go int array to C int array
results := C.malloc(C.size_t(length) * C.size_t(unsafe.Sizeof(uintptr(0))))
pointerResult := (*[1 << 30]C.int)(results)
for i := 0; i < int(length); i++ {
pointerResult[i] = C.int(goResults[i] + 2)
}
return (*C.int)(results)
}


Читать
Изучение C#

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 barf - Basically A Remarkable Framework

Barf - это полезный фреймворк для создания веб-интерфейсов API на основе JSON на Golang.

go get github.com/opensaucerer/barf

Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 Lit bb hack tools

Инструменты командной строки на GO, полезные для поиска багов, тестирования на проникновение и хакинга. Ориентирован на веб-цели.

golangci-lint run

GIthub

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍Что выведет код ?

package main

import (
"fmt"
)

func main() {
x := [2]int{1, 2}
r := [...]int{1, 2}
fmt.Println(x == r)
}


Ответ

@Golang_google
Что выведет код ?
Anonymous Quiz
33%
False
44%
True
17%
Compile time error
6%
Run time error
Openjob: best distributed task scheduling framework

Openjob - это распределенная и высокопроизводительная система планирования задач на Go, которая поддерживает множество cronjob.

Github
Проект
Demo

@Golang_google
WebPalm - это мощный инструмент командной строки на GO для создания карт веб-сайтов и веб-скреппинга. Благодаря рекурсивному подходу он может создать полное дерево всех веб-страниц и ссылок на них на сайте.

Он также может извлекать данные из тела каждой страницы с помощью регулярных выражений, что делает его идеальным инструментом для веб-скрейпинга и извлечения данных.

go install github.com/XORbit01/webpalm@latest

Github

@Golang_google
Как завершить работу Горутин
в Go: Эффективные методы и примеры

Пишите свои примеры завершения Горутин с кодом в комментариях 👇

@Golang_google
📌 Задача расшифровка строки

Сложность: Средняя

Условие задачи: дана строка в формате: k[encoded_string], где k - число повторений зашифрованной строки. Необходимо вывести результирующую строку, которая соответствует расшифровке исходной строки.

Пример:

Ввод:
s = "3[a]2[bc]"
Вывод: "aaabcbc"

Ввод:
s = "3[a2[c]]"
Вывод: "accaccacc"

Решение:

func decodeString(s string) string {
_,answer := decode(s,0)
return strings.Join(answer, "")
}

func decode(s string,i int) (int,[]string){
num := 0
st := []string{}
for i < len(s){
char := string(s[i])
if val, err := strconv.Atoi(char); err == nil {
num = num*10+val
}else if char == "["{
k,l := decode(s,i+1)
for j:=0;j<num;j++{
st = append(st,l...)
}
i = k
num = 0
}else if char == "]"{
return i, st
}else{
st = append(st,char)
}
i+=1
}
return i,st
}


Пишите свое решение в комментариях👇

@Golang_google
👣 asty

Библиотека для удобного преобразования golang AST(Abstract Syntax Tree, абстрактное синтаксическое дерево) в JSON и JSON в AST.

go install github.com/asty-org/asty

asty -h

Github
Asty

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
👣 golang interview prep

Репозиторий, который создан для того, чтобы готовиться к собеседованию на Go на практике.

В данном репозитории находится рабочее CRUD-приложение, которое содержит множество ошибок, противоречащих современным стандартам, а также серьезные проблемы с безопасностью. Хороший вариант, чтобы попрактиковаться и исправить все ошибки.


🖥 Github

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Большой список сайтов с практическимим задачами для программистов.

Operation Go — практика написания кода на Go в форме браузерной игры.

Codeforces — платформа для алгоритмических соревнований. Проводит контесты и раунды с 5 задачами на 2 часа. Есть система рейтинга и два дивизиона. Задачи можно решать и проверять после соревнования. Также есть доступ к тренировкам с задачами с прошлых соревнований.

HackerRank - сайт будет больше интересен продвинутым программистам, которые уже многое умеют. На этом сайте собрано множество задач на самые разные разделы Computer Science: традиционная алгоритмика, ИИ, машинное обучение и т.д. Если вы решите много задач, то вами могут заинтересоваться работодатели, регуляторно мониторящие эту платформу.

Codewars — популярный cборник задач на разные темы, от алгоритмов до шаблонов проектирования.

LeetCode — известный сайт с задачами для подготовки к собеседованиям. Можно пообщаться и посмотреть решения других программистов.

Timus Online Judge — русскоязычная (хотя английский язык также поддерживается) платформа, на которой более тысячи задач удачно отсортированы по темам и по сложности.

TopCoder - популярная американская платформа. Она проводит алгоритмические контесты, а также соревнования по промышленному программированию и марафоны, где задачи требуют исследования и нет единого верного алгоритма. Участникам даются недели на решение таких задач.

informatics.mccme.ru - платформа с теоретическим материалом и задачами, удобно разделенными по категориям. Большая база задач с олимпиад школьников также доступна.

SPOJ - большой англоязычный сайт с 20000+ задачами на разные темы: DP, графы, структуры данных и др. Иногда проводят неинтересные контесты, если не из страны их проведения.

CodeChef — менее крупный аналог Codeforces и TopCoder, тоже с огромным архивом задач и регулярными контестами.

Project Euler - сборник 500 задач, проверяющих знание математических алгоритмов. Часто используется на собеседованиях, чтобы оценить алгоритмическую подготовку кандидата.

Kaggle - соревнования по анализу данных.

Golang tests - канал с тестами по Go

CodinGame - сайт для программистов и геймеров, предлагающий большую коллекцию видеоигр, оформленных в виде задач на программирование.

Al Zimmermann’s Programming Contests — платформа, на которой регулярно проводятся контесты с задачами на исследование и оптимизацию. Интересен тем, что писать программу необязательно — даются только тестовые данные. Ответы можно расчитывать вручную, или просто гадать их на кофейной гуще.

Programming Praxis — сайт, где можно найти много интересных задач.

CheckIO — сайт с задачами для программистов всех уровней, который вы проходите в виде игры.

Ruby Quiz — сайт с задачами для программистов на Ruby, но решения можно писать и на других языках.

Prolog Problems — Подборка задач для программистов, использующих Prolog.

Сборник задач от СppStudio - задачи на С++, но их можно и на других языках.

Empire of Code — сайт для программистов, где необходимо писать код, реализующий стратегию и тактику виртуальных бойцов.

@Golang_google
Внимание, Open Source 🚀

Ребята из PaaS-команды СберМаркета решили подарить миру крутой инструмент для интеграционного тестирования сервисов. Он будет полезен для тестировщиков и бэкендеров.

Кодовое название — grpc-wiremock. Это надстройка для мок-сервера Wiremock, позволяющая поддерживать gRPC, MultiAPI, TLS/SSL и роутинг по домену. А ещё отслеживать изменения в контрактах.

Подробнее об инструменте и том, как мы используем его внутри, читайте на Хабре!
👣 Примеры применения шаблона проектирования Фасад на Go.

Шаблон фасад (англ. Facade) — структурный шаблон проектирования, позволяющий скрыть сложность системы путём сведения всех возможных внешних вызовов к одному объекту, делегирующему их соответствующим объектам системы.

Как вы используете шаблон проектирования фасад в своей работе?

@Golang_google
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM