package main
import (
"errors"
"fmt"
)
func main() {
err := someFunc()
{
keyExistsErr := &KeyExistError{}
if errors.As(err, keyExistsErr) {
fmt.Println("Мы получили ttl:", keyExistsErr.ttl)
}
}
}
type KeyExistError struct {
ttl string
}
func (e KeyExistError) Error() string {
return fmt.Sprint("Отправить код нельзя раньше чем через ", e.ttl, " сек.")
}
func someFunc() error {
return KeyExistError{
ttl: "4",
}
}
package main
import (
"errors"
"fmt"
)
func main() {
err := someFunc()
{
keyExistsErr := &KeyExistError{}
if errors.As(err, keyExistsErr) {
fmt.Println("Мы получили ttl:", keyExistsErr.ttl)
}
}
}
type KeyExistError struct {
ttl string
}
func (e KeyExistError) Error() string {
return fmt.Sprint("Отправить код нельзя раньше чем через ", e.ttl, " сек.")
}
func someFunc() error {
err := someOtherFunc()
if err != nil {
return fmt.Errorf("error calling someOtherFunc: %w", err)
}
return nil
}
func someOtherFunc() error {
return KeyExistError{
ttl: "4",
}
}
import _ "net/http/pprof"
import (
"net/http"
_ "net/http/pprof"
)
...
func main() {
...
http.ListenAndServe("localhost:8080", nil)
}
logger.Setup("log.log")
database.Connect()
settings.Setup("options.json")
go mod init имя_проекта
, именем обычно бывает путь к репозиторию проекта, например: go mod init github.com/myuser/someproject
go get github.com/go-sql-driver/mysql@latest
. Вместо latest можно указывать необходимую вам версию пакета. package main
import (
"bytes"
"io"
"os"
"github.com/olekukonko/tablewriter"
)
func main() {
data := [][]string{
{"1/1/2014", "Domain name", "2233", "$10.98"},
{"1/1/2014", "January Hosting", "2233", "$54.95"},
{"1/4/2014", "February Hosting", "2233", "$51.00"},
{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
}
w := New(os.Stdout)
table := tablewriter.NewWriter(w)
table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
table.SetBorder(false) // Set Border to false
table.AppendBulk(data) // Add Bulk Data
table.Render()
}
type ClrfAdder struct {
writer io.Writer
}
func New(w io.Writer) *ClrfAdder {
return &ClrfAdder{
writer: w,
}
}
func (c ClrfAdder) Write(p []byte) (n int, err error) {
replaced := bytes.ReplaceAll(p, []byte("\n"), []byte("\r\n"))
n, err = c.writer.Write(replaced)
if err != nil {
if n > len(p) {
n = len(p)
}
return n, err
}
return len(p), nil
}
func divide(x ...float64) float64 {
if len(x) == 0 {
return 0
}
if len(x) == 1 {
return x[0]
}
a := x[0]
for _, v := range x[1:] {
a /= v
}
return a
}
cmd := exec.Command("go", "build", ".")
cmd.Env = os.Environ()
cmd.Env = append(cmd.Env, "GOOS=windows")
func start() {
file, _ := os.ReadFile("./data.txt")
for _, i := range strings.Split(string(file), "\n") {
select {
case <-stop:
return
default:
http.Get(Url + i)
}
}
}
package main
import (
"context"
"errors"
"io/ioutil"
"net/http"
"strings"
)
func start() {
file, _ := os.ReadFile("./data.txt")
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // контекст обязательно надо отменять в конце
go func() {
select {
// Отменяем контекст при получении стоп-сигнала
case <-stop:
cancel()
// чтобы горутина завершилась по отмене контекста даже если stop не будет
case <-ctx.Done():
}
}()
for _, i := range strings.Split(string(file), "\n") {
err := processUrl(ctx, Url+i)
if err != nil {
if errors.Is(err, context.Canceled) {
return
}
// обработать ошибку
}
}
}
func processUrl(ctx context.Context, finalUrl string) error {
req, err := http.NewRequestWithContext(ctx, "GET", finalUrl, nil)
if err != nil {
return err
}
res, err := http.DefaultClient.Do(req)
if err != nil {
return err
}
defer res.Body.Close() // обязательно, иначе будет утечка
// обработать ответ
return nil
}
package main
func main() {
var str strType
str.Temp()
}
type strType string
func (s strType) Temp() {
}