라벨이 golang인 게시물 표시

Go(golang) 배열(array)과 슬라이스(slice)

이미지
 안녕하세요. 알렉스입니다. 이번에는 go언어의 배열과 슬라이스에 대해서 알아보겠습니다. Go에서는 배열보다 슬라이스를 자주 사용하지만 슬라이스 밑에는 배열이 존재하고 있습니다. 따라서 배열을 먼저 배우고  슬라이스와 어떤관계에 있는지 알아보겠습니다.  위 사진은 길이가 5인 배열입니다. go에서 위 배열 및 기타 코드를 작성하겠습니다. package main import ( "fmt" ) func main () { // 배열 생성하기 arr := [ 5 ] int { 1 , 2 , 3 , 4 , 5 } fmt. Println (arr) // 해당 배열 출력 for i , v := range arr { fmt. Println (i, v) // 인덱스와 배열값을 1줄씩 출역 } var x int = 3 fmt. Printf ( " %d 인덱스의 배열값은 : %d \n " , x, arr[x]) arr[x] = 10 fmt. Printf ( " %d 인덱스에 변경된 배열값은 : %d \n " , x, arr[x]) fmt. Printf ( "배열 길이 : %d , 배열의 용량 : %d \n " , len (arr), cap (arr)) fmt. Printf ( "원소의 타입 : %T \n " , arr[ 0 ]) } 위 코드를 실행한 결과를 확인하면 배열의 인덱스는 0부터 시작이 되고 4에서 끝납니다. 따라서 값 4를 배열에서 출력할려면 인덱스3을 입력해야 합니다.  그런데 일반적으로 배열은 처음 배열을 만들때 정한 길이에서 더이상 늘어나지 않습니다.(만약 더 넣고 싶다면 길이가 더 긴 배열을 만들어서 해당값을 넣어야 합니다.) 하지만 슬라이스를 이용하면 이러한 불편함을 덜수 있습니다. package main import ( ...

Go(golang) 패키지(package) - 2 1에서 작성한 패키지 설명

이미지
 안녕하세요. 알렉스 입니다. 이번에는 'Go(golang) 패키지(package) - 1 패키지를 이용하여 프로그램 만들기'에서 작성한 코드에 대한 설명을 하겠습니다. 모듈 구조 모듈 구조를 확인할때 자체 package(hello_project)를 제외하고 모두 외부에서 가져다 참고합니다. package import 형태  다만 외부에서 package를 갖고와도 go언어에서 기본으로 제공하는 package가 있고 그 외의 package가 있습니다. package를 import할때 내부적으로 생성한 package와 기본 제공 package, 그리고 외부 package가 있습니다. 모듈 내부에서 생성한 package는 서버에 올리지 않는 이상 해당 모듈안에서만 사용할수 있습니다.   기본 제공 package(예로들어 fmt package) 다운로드 없이 해당 go 코드에 import해서 바로 사용할수 있습니다.  그리고 외부 package는 해당 package를 받고난 이후 import를 해서 사용할수 있습니다. 기본(표준) go package : https://golang.org/pkg/ 개발자들이 많이 사용하는 package : https://github.com/avelino/awesome-go 이렇게 package를 받아서 해당 함수를 이용하여 더 짧은시간안에 Go 프로그램을 만들수가 있습니다.

Go(golang) 패키지(package) - 1 패키지를 이용하여 프로그램 만들기

이미지
 안녕하세요. 알렉스 입니다. 이번에는 패키지의 개념에 대해서 알기 전에 먼저 패키지로 go 프로그램을 짜도록 하겠습니다. 작성할 코드는 간단한 "Hello World"를 출력해 주고 float64배열을 받아서 ASCII코드로 그래프를 그려주는 패키지를 사용할 것입니다. "Hello World"는 직접 패키지를 만들것이고 ASCII코드로 그래프를 그려주는 패키지는 외부에서 받을 것입니다. 사진1) 프로젝트 폴더 생성 사진2) hello폴더 및 go 파일 생성 사진3) hello.go 코딩 위 hello.go는 main함수가 아닌 hello패키지의 한 function입니다. 해당 패키지의 함수를 외부에서 참고하기 위해서는 함부 맨 앞글자가 반드시 대문자여야 합니다. (소문자면 해당 파일에만 사용할수 있음) 사진4) main.go 코딩 새로운 go module 생성하기 $ go mod init [module name] copy 사진4에서 5번째 줄에서 작성한 패키지의 앞부분은 모듈이름 입니다. 해당 모듈내의 폴더를 참고하는 것입니다. 즉 hello_project(모듈) -> hello(폴더)를 패키지를 부를때 참고하겠다는 것입니다. 그리고 현재 유일하게 있는 패키지는 hello외에 없습니다. 모듈의 요구사항 및 sums을 추가하기 위한 cli $ go tidy copy 사진5) 'go tidy' 이후 결과 이제 'go tidy'를 이용하여 외부패키지를 다운 받습니다. 이때 'go.sum'파일이 생성됩니다. 사진6) go.sum파일  node로 비교하자면 go.mod는 package.json과 비슷하고 go.sum은 package-lock.json과 비슷하다고 볼수 있습니다. go 파일을 바로 실행하기 $ go run [Main File] copy 빌드후 실행 파일을 실행하기( 참고링크 ) $ go build copy 사진5)...

Go(golang) 포인터(pointer * &)

이미지
 안녕하세요. 이번에는 go언어에서 포인터에 대해서 이야기 하도록 하겠습니다. 사진1) int64형 포인터가 int64변수의 주소를 저장 각 메모리마다 주소가 있는데 포인터 변수는 이 주소를 저장합니다. 포인터를 이용하여 해당 변수를 수정할수 있습니다. package main import ( "fmt" ) func main (){ // int64변수 할당 var num int64 = 30 // pointer를 포인터 int64로 할당 var pointer * int64 // pointer에 num주소를 저장 pointer = &num // pointer의 주소를 확인 fmt. Printf ( "pointer address : %p \n " , pointer) // pointer가 가르키는 주소의 실제값을 확인 fmt. Printf ( "pointer value : %v \n " , *pointer) // pointer를 이용하여 num값을 60으로 변경 * pointer = 60 // pointer를 이용하여 num값 변경 확인 fmt. Printf ( "pointer value(change) : %v \n " , *pointer) } 코드1) 포인터를 이용하여 int64변수 주소값 저장 및 수정 사진2) 코드1의 결과 기본적으로 포인터는 nil값입니다. 하지만 nil값이 아니면 다른 메모리 공간을 가르키고 있다는 뜻입니다. package main import ( "fmt" ) func add5toInt (num int64 ) { num += 5 fmt. Println ( "add5toInt result :" , num) } func main (){ // int64변수 할당 var num int64 = 30 // add5toInt함수를 이용하여...

Go(golang) 구조체(struct)

이미지
 안녕하세요. 이번에는 golang의 구조체에 대해서 알아보겠습니다.  사진1) 구조체 선언 사진1과 같이 타입을 선언할수 있습니다. 1) 타입 선언 2) 선언할 타입의 이름 3) 구조체 선언 4) 해당 구조체의 원소 타입 선언 package main import ( "fmt" "unsafe" ) // 학생 타입 선언 type Student struct { age int32 // 4 byte name string // 16 byte } // 학점 타입 선언 type Grade struct { student Student score float32 year uint8 } func main (){ // 타입을 이용여 변수 선언 및 age, name 할당 var stu1 Student = Student{ 32 , "alex" , } // 64비트 운영체제의 실제 stu1 구조체(struct)의 크기를 측정할때 20byte가 아닌 24byte로 출력된다. fmt. Println (unsafe. Sizeof (stu1)) // 타입을 이용하여 stu1Grade를 Grade타입으로 선언하고 원소값 할당 var stu1Grade Grade = Grade{ stu1, 100 , 2 , } // stu1에서 name과 age를 각각 출력 fmt. Println ( "stu1출력 :" ,stu1.name, stu1.age) // stu1Grade에서 name과 age를 각각 출력 fmt. Println ( "stu1Grade 출력 :" ,stu1Grade.student.name, stu1Grade.student.age) } 코드1) struct 크기 사진2) struct 메모리 할당 그런데 코드1에서 Student타입의 크기는 24byte로 출력 되었습니다. 이는...

Go(golang) html를 재사용하기-1

위 글에 나오는 코드는 이전 글에서 참고한 것입니다. 링크를 참고해 주세요. 먼저 'base.page.tmpl'를 생성해 줍니다. $ touch ./templates/base.page.tmpl <!-- base template 시작지점 --> {{ define "base"}} <!-- ./templates/base.layout.tmpl --> <! DOCTYPE html > < html lang = "en" > < head > < meta charset = "UTF-8" /> < meta name = "viewport" content = "width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" /> < meta http-equiv = "X-UA-Compatible" content = "ie=edge" /> < title > Document </ title > < link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity = "sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin = "anonymous" /> </ head > {{bloc...

Go(golang) 에러 출력하기

이미지
package main import ( "errors" "fmt" ) func main (){ // 2개의 변수 설정 var num1 , num2 float32 fmt. Printf ( "Enter num1 : " ) fmt. Scan (&num1) fmt. Printf ( "Enter num2 : " ) fmt. Scan (&num2) result , err := divideValues (num1, num2) // 에러 발생시 if문 출력 if err != nil { fmt. Println (err) return } fmt. Println ( "result :" , result) } func divideValues (x,y float32 ) ( float32 , error ) { // y값이 0일시 나눌수가 없음으로 error출력 if y == 0 { err := errors. New ( "cannot divide by zero" ) return 0 , err } result := x/y return result, nil }   divideValues함수는 y값에 0이 들어오면 return으로 0, [Error내용] 이 나오도록 하였습니다. 사진1) 테스트 사진1과 같이 num2(y)값에 0을 입력하게 되면 'cannot divide by zero'가 출력됩니다. 그 외에 대해서는 정상적으로 값이 출력 됩니다. 개발자 디스코드 서버에 초대합니다. 사진) 아래링크 클릭시 커뮤니티로 초대 Comunity Discord Link

Go(golang) HTML을 출력해 주는 서버 만들기(module사용)

이미지
해당 작성 코드는 위 링크를 참고해 주시기 바랍니다.  ( 링크 ) // ./main.go package main import ( "fmt" "html/template" "net/http" ) // 포트번호 지정 const portNumber = ":8080" func Home (w http.ResponseWriter, r *http.Request){ renderTemplate (w, "home.page.tmpl" ) } func About (w http.ResponseWriter, r *http.Request){ renderTemplate (w, "about.page.tmpl" ) } // 해당 tmpl을 rendering합니다. func renderTemplate (w http.ResponseWriter, tmpl string ) { // 해당 tmpl파일을 파싱 합니다. parseTemp , _ := template. ParseFiles ( "./templates/" + tmpl) // 파싱한 tmpl파일을 응답합니다. err := parseTemp. Execute (w, nil ) // 에러 발생시 if문 실행 if err != nil { fmt. Println ( "error parsing template" , err) return } } func main (){ http. HandleFunc ( "/" , Home) http. HandleFunc ( "/about" , About) fmt. Println (fmt. Sprintf ( "Starting application on port %s " , portNumber)) _ = http. ListenAndServ...

Go(golang) HTML을 출력해 주는 서버 만들기(module없이)

이미지
  초기 코드 // ./main.go package main import ( "fmt" "net/http" ) // 포트번호 지정 const portNumber = ":8080" func Home (w http.ResponseWriter, r *http.Request){ } func About (w http.ResponseWriter, r *http.Request){ } func main (){ http. HandleFunc ( "/" , Home) http. HandleFunc ( "/about" , About) fmt. Println (fmt. Sprintf ( "Starting application on port %s " , portNumber)) _ = http. ListenAndServe (portNumber, nil ) } 사진1) 폴더 및 .tmpl파일 생성 <!-- ./templates/home.page.tmpl --> <! DOCTYPE html > < html lang = "en" > < head > < meta charset = "UTF-8" /> < meta http-equiv = "X-UA-Compatible" content = "IE=edge" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title > Home Page </ title > </ head > < body > < h1 > This is...