'Programming/golang'에 해당되는 글 103건

  1. 2022.09.23 golang REST client
  2. 2022.09.15 golang 'go doc'
  3. 2022.09.15 golang main arg, getopt
  4. 2022.09.15 golang json
  5. 2022.09.15 golang ini
  6. 2022.09.14 golang http.request
  7. 2022.09.06 golang range
  8. 2022.09.06 golang mutex
  9. 2022.09.06 golang make와 new
  10. 2022.09.06 golang defer 와 panic(), recover()
Programming/golang2022. 9. 23. 15:06

 

[링크 : http://golang.site/go/article/103-HTTP-POST-호출]

 

net/http 패키지에 Get() Post() 명령등을 사용하면 간단하게 보낼수 있는 듯.

resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://example.com/form",
	url.Values{"key": {"Value"}, "id": {"123"}})

[링크 : https://pkg.go.dev/net/http]

 

Put() Delete()는 http.NewRequest()를 이용하여 http.MethodPut / http.MethodDelete 타입으로 만들어 주면

기본 모듈로도 충분히 구현 가능한 것 같다.

func put() {
    fmt.Println("3. Performing Http Put...")
    todo := Todo{1, 2, "lorem ipsum dolor sit amet", true}
    jsonReq, err := json.Marshal(todo)
    req, err := http.NewRequest(http.MethodPut, "https://jsonplaceholder.typicode.com/todos/1", bytes.NewBuffer(jsonReq))
    req.Header.Set("Content-Type", "application/json; charset=utf-8")
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }

    defer resp.Body.Close()
    bodyBytes, _ := ioutil.ReadAll(resp.Body)

    // Convert response body to string
    bodyString := string(bodyBytes)
    fmt.Println(bodyString)

    // Convert response body to Todo struct
    var todoStruct Todo
    json.Unmarshal(bodyBytes, &todoStruct)
    fmt.Printf("API Response as struct:\n%+v\n", todoStruct)
}

func delete() {
    fmt.Println("4. Performing Http Delete...")
    todo := Todo{1, 2, "lorem ipsum dolor sit amet", true}
    jsonReq, err := json.Marshal(todo)
    req, err := http.NewRequest(http.MethodDelete, "https://jsonplaceholder.typicode.com/todos/1", bytes.NewBuffer(jsonReq))
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }

    defer resp.Body.Close()
    bodyBytes, _ := ioutil.ReadAll(resp.Body)

    // Convert response body to string
    bodyString := string(bodyBytes)
    fmt.Println(bodyString)
}

[링크 : https://www.soberkoder.com/consume-rest-api-go/]

'Programming > golang' 카테고리의 다른 글

golang 함수 인자에 함수 넣기  (0) 2022.09.27
golang package main  (0) 2022.09.23
golang 'go doc'  (0) 2022.09.15
golang main arg, getopt  (0) 2022.09.15
golang json  (0) 2022.09.15
Posted by 구차니
Programming/golang2022. 9. 15. 19:02

 

$ go doc os.Pipe
package os // import "os"

func Pipe() (r *File, w *File, err error)
    Pipe returns a connected pair of Files; reads from r return bytes written to
    w. It returns the files and an error, if any.

 

$ go doc os
package os // import "os"

Package os provides a platform-independent interface to operating system
functionality. The design is Unix-like, although the error handling is Go-like;
failing calls return values of type error rather than error numbers. Often, more
information is available within the error. For example, if a call that takes a
file name fails, such as Open or Stat, the error will include the failing file
name when printed and will be of type *PathError, which may be unpacked for more
information.

The os interface is intended to be uniform across all operating systems.
Features not generally available appear in the system-specific package syscall.

Here is a simple example, opening a file and reading some of it.

    file, err := os.Open("file.go") // For read access.
    if err != nil {
     log.Fatal(err)
    }

If the open fails, the error string will be self-explanatory, like

    open file.go: no such file or directory

The file's data can then be read into a slice of bytes. Read and Write take
their byte counts from the length of the argument slice.

    data := make([]byte, 100)
    count, err := file.Read(data)
    if err != nil {
     log.Fatal(err)
    }
    fmt.Printf("read %d bytes: %q\n", count, data[:count])

Note: The maximum number of concurrent operations on a File may be limited by
the OS or the system. The number should be high, but exceeding it may degrade
performance or cause other issues.

const O_RDONLY int = syscall.O_RDONLY ...
const SEEK_SET int = 0 ...
const PathSeparator = '/' ...
const ModeDir = fs.ModeDir ...
const DevNull = "/dev/null"
var ErrInvalid = fs.ErrInvalid ...
var Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") ...
var Args []string
var ErrProcessDone = errors.New("os: process already finished")
func Chdir(dir string) error
func Chmod(name string, mode FileMode) error
func Chown(name string, uid, gid int) error
func Chtimes(name string, atime time.Time, mtime time.Time) error
func Clearenv()
func DirFS(dir string) fs.FS
func Environ() []string
func Executable() (string, error)
func Exit(code int)
func Expand(s string, mapping func(string) string) string
func ExpandEnv(s string) string
func Getegid() int
func Getenv(key string) string
func Geteuid() int
func Getgid() int
func Getgroups() ([]int, error)
func Getpagesize() int
func Getpid() int
func Getppid() int
func Getuid() int
func Getwd() (dir string, err error)
func Hostname() (name string, err error)
func IsExist(err error) bool
func IsNotExist(err error) bool
func IsPathSeparator(c uint8) bool
func IsPermission(err error) bool
func IsTimeout(err error) bool
func Lchown(name string, uid, gid int) error
func Link(oldname, newname string) error
func LookupEnv(key string) (string, bool)
func Mkdir(name string, perm FileMode) error
func MkdirAll(path string, perm FileMode) error
func MkdirTemp(dir, pattern string) (string, error)
func NewSyscallError(syscall string, err error) error
func Pipe() (r *File, w *File, err error)
func ReadFile(name string) ([]byte, error)
func Readlink(name string) (string, error)
func Remove(name string) error
func RemoveAll(path string) error
func Rename(oldpath, newpath string) error
func SameFile(fi1, fi2 FileInfo) bool
func Setenv(key, value string) error
func Symlink(oldname, newname string) error
func TempDir() string
func Truncate(name string, size int64) error
func Unsetenv(key string) error
func UserCacheDir() (string, error)
func UserConfigDir() (string, error)
func UserHomeDir() (string, error)
func WriteFile(name string, data []byte, perm FileMode) error
type DirEntry = fs.DirEntry
    func ReadDir(name string) ([]DirEntry, error)
type File struct{ ... }
    func Create(name string) (*File, error)
    func CreateTemp(dir, pattern string) (*File, error)
    func NewFile(fd uintptr, name string) *File
    func Open(name string) (*File, error)
    func OpenFile(name string, flag int, perm FileMode) (*File, error)
type FileInfo = fs.FileInfo
    func Lstat(name string) (FileInfo, error)
    func Stat(name string) (FileInfo, error)
type FileMode = fs.FileMode
type LinkError struct{ ... }
type PathError = fs.PathError
type ProcAttr struct{ ... }
type Process struct{ ... }
    func FindProcess(pid int) (*Process, error)
    func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)
type ProcessState struct{ ... }
type Signal interface{ ... }
    var Interrupt Signal = syscall.SIGINT ...
type SyscallError struct{ ... }

 

 

$ go help
Go is a tool for managing Go source code.

Usage:

go <command> [arguments]

The commands are:

bug         start a bug report
build       compile packages and dependencies
clean       remove object files and cached files
doc         show documentation for package or symbol

 

$ go help doc
usage: go doc [doc flags] [package|[package.]symbol[.methodOrField]]

Doc prints the documentation comments associated with the item identified by its
arguments (a package, const, func, type, var, method, or struct field)
followed by a one-line summary of each of the first-level items "under"
that item (package-level declarations for a package, methods for a type,
etc.).

Doc accepts zero, one, or two arguments.

Given no arguments, that is, when run as

go doc

it prints the package documentation for the package in the current directory.
If the package is a command (package main), the exported symbols of the package
are elided from the presentation unless the -cmd flag is provided.

When run with one argument, the argument is treated as a Go-syntax-like
representation of the item to be documented. What the argument selects depends
on what is installed in GOROOT and GOPATH, as well as the form of the argument,
which is schematically one of these:

go doc <pkg>
go doc <sym>[.<methodOrField>]
go doc [<pkg>.]<sym>[.<methodOrField>]
go doc [<pkg>.][<sym>.]<methodOrField>

The first item in this list matched by the argument is the one whose documentation
is printed. (See the examples below.) However, if the argument starts with a capital
letter it is assumed to identify a symbol or method in the current directory.

For packages, the order of scanning is determined lexically in breadth-first order.
That is, the package presented is the one that matches the search and is nearest
the root and lexically first at its level of the hierarchy. The GOROOT tree is
always scanned in its entirety before GOPATH.

If there is no package specified or matched, the package in the current
directory is selected, so "go doc Foo" shows the documentation for symbol Foo in
the current package.

The package path must be either a qualified path or a proper suffix of a
path. The go tool's usual package mechanism does not apply: package path
elements like . and ... are not implemented by go doc.

When run with two arguments, the first is a package path (full path or suffix),
and the second is a symbol, or symbol with method or struct field:

go doc <pkg> <sym>[.<methodOrField>]

In all forms, when matching symbols, lower-case letters in the argument match
either case but upper-case letters match exactly. This means that there may be
multiple matches of a lower-case argument in a package if different symbols have
different cases. If this occurs, documentation for all matches is printed.

Examples:
go doc
Show documentation for current package.
go doc Foo
Show documentation for Foo in the current package.
(Foo starts with a capital letter so it cannot match
a package path.)
go doc encoding/json
Show documentation for the encoding/json package.
go doc json
Shorthand for encoding/json.
go doc json.Number (or go doc json.number)
Show documentation and method summary for json.Number.
go doc json.Number.Int64 (or go doc json.number.int64)
Show documentation for json.Number's Int64 method.
go doc cmd/doc
Show package docs for the doc command.
go doc -cmd cmd/doc
Show package docs and exported symbols within the doc command.
go doc template.new
Show documentation for html/template's New function.
(html/template is lexically before text/template)
go doc text/template.new # One argument
Show documentation for text/template's New function.
go doc text/template new # Two arguments
Show documentation for text/template's New function.

At least in the current tree, these invocations all print the
documentation for json.Decoder's Decode method:

go doc json.Decoder.Decode
go doc json.decoder.decode
go doc json.decode
cd go/src/encoding/json; go doc decode

Flags:
-all
Show all the documentation for the package.
-c
Respect case when matching symbols.
-cmd
Treat a command (package main) like a regular package.
Otherwise package main's exported symbols are hidden
when showing the package's top-level documentation.
-short
One-line representation for each symbol.
-src
Show the full source code for the symbol. This will
display the full Go source of its declaration and
definition, such as a function definition (including
the body), type declaration or enclosing const
block. The output may therefore include unexported
details.
-u
Show documentation for unexported as well as exported
symbols, methods, and fields.

'Programming > golang' 카테고리의 다른 글

golang package main  (0) 2022.09.23
golang REST client  (0) 2022.09.23
golang main arg, getopt  (0) 2022.09.15
golang json  (0) 2022.09.15
golang ini  (0) 2022.09.15
Posted by 구차니
Programming/golang2022. 9. 15. 19:00

 

package main

import (
	"fmt"
	"os"
)

func main() {
	argsWithProg := os.Args
	argsWithoutProg := os.Args[1:]

	// You can get individual args with normal indexing.
	arg := os.Args[3]

	fmt.Println(argsWithProg)
	fmt.Println(argsWithoutProg)
	fmt.Println(arg)
}

[링크 : https://gobyexample.com/command-line-arguments]

[링크 : https://stackoverflow.com/questions/2707434/how-to-access-command-line-arguments-passed-to-a-go-program]

[링크 : https://golangdocs.com/command-line-arguments-in-golang]

 

[링크 : https://pkg.go.dev/github.com/pborman/getopt]

 

[링크 : https://pkg.go.dev/os]

'Programming > golang' 카테고리의 다른 글

golang REST client  (0) 2022.09.23
golang 'go doc'  (0) 2022.09.15
golang json  (0) 2022.09.15
golang ini  (0) 2022.09.15
golang http.request  (0) 2022.09.14
Posted by 구차니
Programming/golang2022. 9. 15. 10:36

프로그램 환경설정 파일로 ini나 다른걸 찾아보는데

golang 기본 라이브러리로 json이 있고 yaml은 없다고 하니 고민중

 

func LoadConfigration(path string) Config {
    var config Config
    file, err := os.Open("config.json")
    defer file.Close()
    if err != nil {
        fmt.Println(err.Error())
    }
    jsonParser := json.NewDecoder(file)
    jsonParser.Decode(&config)
    return config
}

[링크 : https://loperlee.tistory.com/15]

 

import "encoding/json"

[링크 : https://pkg.go.dev/encoding/json]

'Programming > golang' 카테고리의 다른 글

golang 'go doc'  (0) 2022.09.15
golang main arg, getopt  (0) 2022.09.15
golang ini  (0) 2022.09.15
golang http.request  (0) 2022.09.14
golang range  (0) 2022.09.06
Posted by 구차니
Programming/golang2022. 9. 15. 10:34

'Programming > golang' 카테고리의 다른 글

golang main arg, getopt  (0) 2022.09.15
golang json  (0) 2022.09.15
golang http.request  (0) 2022.09.14
golang range  (0) 2022.09.06
golang mutex  (0) 2022.09.06
Posted by 구차니
Programming/golang2022. 9. 14. 16:26

ajax를 통해 DELETE type으로 변수를 넘겨줄 수 있나 찾아보는데

정작 보낸다고 해도 어떻게 golang에서 받아서 쓸 수 있나, r.ParseForm() 같은거 있나 찾아보는데 영 안보인다.

 

오랫만에 jquery  보니 ajax로 어떻게 DELETE를 보내더라? 기억도 잘 안나고 ㅠㅠ

[링크 : https://api.jquery.com/jQuery.ajax/#options]

 

부랴부랴 뒤져서 http.Request의 원형(?)을 찾았는데, Body와 GetBody() 발견

type Request struct {
Method string
URL *url.URL
Proto      string // "HTTP/1.0"
ProtoMajor int    // 1
ProtoMinor int    // 0
Header Header
Body io.ReadCloser
GetBody func() (io.ReadCloser, error)
ContentLength int64
TransferEncoding []string
Close bool
Host string
Form url.Values
PostForm url.Values
MultipartForm *multipart.Form
Trailer Header
RemoteAddr string
RequestURI string
TLS *tls.ConnectionState
Cancel <-chan struct{}
Response *Response
}

[링크 : https://pkg.go.dev/net/http#Request]

[링크 : https://www.digitalocean.com/community/tutorials/how-to-make-http-requests-in-go]

 

요거 되긴 한다. body에 json 담아 보내면 이렇게 읽으면 되는 듯

다만 "io/ioutil" 패키지를 추가해주어야 한다.

b, err := ioutil.ReadAll(req.Body)
if err != nil {
    panic(err)
}

fmt.Printf("%s", b)

[링크 : https://stackoverflow.com/questions/46579429/golang-cant-get-body-from-request-getbody]

[링크 : https://stackoverflow.com/questions/33164564/golang-parse-post-request]

 

$.ajax({
    url: '/v1/object/3.json',
    method: 'DELETE',
    contentType: 'application/json',
    success: function(result) {
        // handle success
    },
    error: function(request,msg,error) {
        // handle failure
    }
});

[링크 : https://stackoverflow.com/questions/2153917/how-to-send-a-put-delete-request-in-jquery]

[링크 : https://stackoverflow.com/questions/15088955/how-to-pass-data-in-the-ajax-delete-request-other-than-headers]

 

걍 속편하게 mux 쓰는게 나으려나?

[링크 : https://github.com/gorilla/mux]

  [링크 : https://morioh.com/p/9a0e53da7908]

'Programming > golang' 카테고리의 다른 글

golang json  (0) 2022.09.15
golang ini  (0) 2022.09.15
golang range  (0) 2022.09.06
golang mutex  (0) 2022.09.06
golang make와 new  (0) 2022.09.06
Posted by 구차니
Programming/golang2022. 9. 6. 17:03

일종의.. foreach 느낌인데

range pow 하면 pow에 들은 {1,2,4,8,16,32,64,128} 이 array index와 함께 i,v 값으로 나온다.

 

2**0=1 이렇게 해놔서 무슨 수식인줄 알았네 -_-

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
for i, v := range pow {
fmt.Printf("2**%d = %d\n", i, v)
}
}
2**0 = 1
2**1 = 2
2**2 = 4
2**3 = 8
2**4 = 16
2**5 = 32
2**6 = 64
2**7 = 128

[링크 : https://go.dev/tour/moretypes/16]

 

[링크 : https://changhoi.kim/posts/go/about-go-range/]

[링크 : https://pronist.dev/88]

[링크 : https://gobyexample.com/range]

'Programming > golang' 카테고리의 다른 글

golang ini  (0) 2022.09.15
golang http.request  (0) 2022.09.14
golang mutex  (0) 2022.09.06
golang make와 new  (0) 2022.09.06
golang defer 와 panic(), recover()  (0) 2022.09.06
Posted by 구차니
Programming/golang2022. 9. 6. 16:54

세마포어는 있는지 모르겠다만 mutex는 존재하네

 

package main

import (
"fmt"
"sync"
"time"
)

// SafeCounter is safe to use concurrently.
type SafeCounter struct {
mu sync.Mutex
v  map[string]int
}

// Inc increments the counter for the given key.
func (c *SafeCounter) Inc(key string) {
c.mu.Lock()
// Lock so only one goroutine at a time can access the map c.v.
c.v[key]++
c.mu.Unlock()
}

// Value returns the current value of the counter for the given key.
func (c *SafeCounter) Value(key string) int {
c.mu.Lock()
// Lock so only one goroutine at a time can access the map c.v.
defer c.mu.Unlock()
return c.v[key]
}

[링크 : https://go.dev/tour/concurrency/9]

 

관련 검색어로 golang mutex vs channel 이라는게 나오는데 channel이 그렇게 빠르지는 않은 듯.

[링크 : http://www.dogfootlife.com/archives/452]

[링크 : https://github.com/golang/go/wiki/MutexOrChannel]

[링크 : https://go.dev/doc/effective_go#channels]

'Programming > golang' 카테고리의 다른 글

golang http.request  (0) 2022.09.14
golang range  (0) 2022.09.06
golang make와 new  (0) 2022.09.06
golang defer 와 panic(), recover()  (0) 2022.09.06
go 루틴  (0) 2022.09.06
Posted by 구차니
Programming/golang2022. 9. 6. 15:27

new는 c의 malloc()에 대응한다면

make는 특정 경우에 대한 메모리 할당 + 초기화를 위한 키워드인 듯.

package main

import "fmt"

func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
}

func main() {
s := []int{7, 2, 8, -9, 4, 0}

c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // receive from c

fmt.Println(x, y, x+y)
}

[링크 : https://go.dev/tour/concurrency/2]

 

Allocation with new
Go has two allocation primitives, the built-in functions new and make. They do different things and apply to different types, which can be confusing, but the rules are simple. Let's talk about new first. It's a built-in function that allocates memory, but unlike its namesakes in some other languages it does not initialize the memory, it only zeros it. That is, new(T) allocates zeroed storage for a new item of type T and returns its address, a value of type *T. In Go terminology, it returns a pointer to a newly allocated zero value of type T.
Since the memory returned by new is zeroed, it's helpful to arrange when designing your data structures that the zero value of each type can be used without further initialization. This means a user of the data structure can create one with new and get right to work. For example, the documentation for bytes.Buffer states that "the zero value for Buffer is an empty buffer ready to use." Similarly, sync.Mutex does not have an explicit constructor or Init method. Instead, the zero value for a sync.Mutex is defined to be an unlocked mutex.

[링크 : https://go.dev/doc/effective_go#allocation_new]

 

Allocation with make
Back to allocation. The built-in function make(T, args) serves a purpose different from new(T). It creates slices, maps, and channels only, and it returns an initialized (not zeroed) value of type T (not *T). 

[링크 : https://go.dev/doc/effective_go#allocation_make]

[링크 : https://pronist.dev/102]

 

'Programming > golang' 카테고리의 다른 글

golang range  (0) 2022.09.06
golang mutex  (0) 2022.09.06
golang defer 와 panic(), recover()  (0) 2022.09.06
go 루틴  (0) 2022.09.06
golang https server  (0) 2022.09.05
Posted by 구차니
Programming/golang2022. 9. 6. 15:13

panic은 c로 치면 exit()도, recover()는 return 정도라고 보면 되려나?

package main
 
import "os"
 
func main() {
    // 잘못된 파일명을 넣음
    openFile("Invalid.txt")
     
    // openFile() 안에서 panic이 실행되면
    // 아래 println 문장은 실행 안됨
    println("Done") 
}
 
func openFile(fn string) {
    f, err := os.Open(fn)
    if err != nil {
        panic(err)
    }
 
    defer f.Close()
}










package main
 
import (
    "fmt"
    "os"
)
 
func main() {
    // 잘못된 파일명을 넣음
    openFile("Invalid.txt")
 
    // recover에 의해
    // 이 문장 실행됨
    println("Done") 
}
 
func openFile(fn string) {
    // defer 함수. panic 호출시 실행됨
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("OPEN ERROR", r)
        }
    }()
 
    f, err := os.Open(fn)
    if err != nil {
        panic(err)
    }
 
    defer f.Close()
}
$ ./panic
panic: open Invalid.txt: no such file or directory

goroutine 1 [running]:
main.openFile({0x8b9f9, 0xb})
        /home/pi/panic.go:17 +0xb4
main.main()
        /home/pi/panic.go:7 +0x24
$ ./recover
OPEN ERROR open Invalid.txt: no such file or directory
Done





[링크 : http://golang.site/go/article/20-Go-defer와-panic]

'Programming > golang' 카테고리의 다른 글

golang mutex  (0) 2022.09.06
golang make와 new  (0) 2022.09.06
go 루틴  (0) 2022.09.06
golang https server  (0) 2022.09.05
golang 쿠키  (0) 2022.09.02
Posted by 구차니