package main import "fmt" func main() { var number1 int = 10 // 정수형 변수 선언과 초기화 var number2 = 20 // 타입 추론을 통해 int 타입으로 선언됨 number3 := 30 // := 연산자를 사용한 짧은 변수 선언과 초기화 // 문자열 변수 선언과 초기화 var message string = "Hello, Go!" message2 := "안녕하세요, 고!" // 변수 값 출력 fmt.Println("Number 1:", number1) fmt.Println("Number 2:", number2) }
서버 만들기 20 uint8 the set of all unsigned 8-bit integers (0 to 255) uint16 the set of all unsigned 16-bit integers (0 to 65535) uint32 the set of all unsigned 32-bit integers (0 to 4294967295) uint64 the set of all unsigned 64-bit integers (0 to 18446744073709551615) int8 the set of all signed 8-bit integers (-128 to 127) int16 the set of all signed 16-bit integers (-32768 to 32767) int32 the set of all signed 32-bit integers (-2147483648 to 2147483647) int64 the set of all signed 64-bit integers (-9223372036854775808 to 9223372036854775807) float32 the set of all IEEE-754 32-bit floating-point numbers float64 the set of all IEEE-754 64-bit floating-point numbers complex64 the set of all complex numbers with float32 real and imaginary parts complex128 the set of all complex numbers with float64 real and imaginary parts byte alias for uint8 rune alias for int32
만들기 21 func main() { var numbers [3]int // 크기가 3인 정수형 배열 선언과 초기화 numbers[0] = 10 // 배열 요소에 값 할당 numbers[1] = 20 numbers[2] = 30 fmt.Println("Numbers array:", numbers) // 배열 요소 출력 // 배열의 각 요소 출력 for i := 0; i < len(numbers); i++ { fmt.Printf("Index: %d, Value: %d\n", i, numbers[i]) } }
23 func main() { // 변수 선언 age := 20 // if 문 사용 if age > 18 { fmt.Println("성인입니다.") } else { fmt.Println("미성년자입니다.") } } // if 문 안에서 변수 선언과 초기화 후 조건 처리 if age := 20; age > 18 { fmt.Println("성인입니다.") } else { fmt.Println("미성년자입니다.") }
24 func main() { // 1부터 10까지의 숫자 출력 for i := 1; i <= 10; i++ { fmt.Println(i) } } for { fmt.Println("무한 루프") } // 슬라이스 순회 for index, value := range numbers { fmt.Printf("인덱스: %d, 값: %d\n", index, value) } i := 0 // 조건식만 사용한 for 루프 for i < 5 { fmt.Println(i) i++ }
25 func main() { fruit := "apple" switch fruit { case "apple": fmt.Println("사과입니다.") case "banana": fmt.Println("바나나입니다.") case "orange": fmt.Println("오렌지입니다.") default: fmt.Println("다른 과일입니다.") } }
// multiplyAndDivide 함수 정의: 두 개의 정수를 받아 곱과 나눗셈의 결과를 반환 func multiplyAndDivide(x, y int) (int, float64) { multiplyResult := x * y divideResult := float64(x) / float64(y) return multiplyResult, divideResult } func main() { // multiplyAndDivide 함수 호출하여 결과 출력 multiplyResult, divideResult := multiplyAndDivide(10, 5) fmt.Println("곱셈 결과:", multiplyResult) fmt.Println("나눗셈 결과:", divideResult) }
func main() { // 파일을 열기 위해 os.Open 호출 file, err := os.Open("example.txt") if err != nil { fmt.Println("파일을 열 수 없습니다:", err) return } // 함수가 종료되기 직전에 파일을 닫음 (defer 사용) defer file.Close() // 파일에서 데이터를 읽기 위해 필요한 코드 // (이 코드는 파일을 닫기 전까지 실행되지 않음) fmt.Println("파일을 성공적으로 열었습니다.") }
28 func divide(x, y float64) (float64, error) { if y == 0 { return 0, errors.New( "나누는 수는 0이 될 수 없습니다.") } return x / y, nil } func main() { // divide 함수 호출하여 결과 출력 result, err := divide(10, 2) if err != nil { fmt.Println("오류 발생:", err) } else { fmt.Println("나눗셈 결과:", result) } // 0으로 나누는 경우 에러 발생 result, err = divide(10, 0) if err != nil { fmt.Println("오류 발생:", err) } else { fmt.Println("나눗셈 결과:", result) } }
ch := make(chan int) // 정수형 채널 생성 ch <- 10 // 정수 10을 채널 ch에 보냄 x := <-ch // 채널 ch에서 값을 받아 변수 x에 할당 close(ch) // 채널 ch를 닫음 // 값 보내기만 가능한 채널 func sendOnly(ch chan<- int) { ch <- 10 } // 값 받기만 가능한 채널 func receiveOnly(ch <-chan int) { x := <-ch }
// 고루틴에서 수행될 함수 func worker(id int, jobs <-chan int, results chan<- int) { for job := range jobs { fmt.Printf("Worker %d is processing job %d\n", id, job) time.Sleep(time.Second) // 일부러 1초간 대기 results <- job * 2 // 작업의 결과를 결과 채널로 전송 } } func main() { // 작업을 보낼 채널과 결과를 받을 채널 생성 jobs := make(chan int, 5) results := make(chan int, 5) // 고루틴으로 여러 개의 worker 실행 for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // 작업 보내기 for j := 1; j <= 5; j++ { jobs <- j } close(jobs) // 모든 작업이 전송되었음을 알림 // 모든 결과 수신 for a := 1; a <= 5; a++ { result := <-results fmt.Println("Received result:", result) } }
the specified resource. Requests using GET should only retrieve data. • POST → The POST method submits an entity to the specified resource, often causing a change in state or side effects on the server. • PUT → The PUT method replaces all current representations of the target resource with the request payload. • DELETE → The DELETE method deletes the specified resource. Go 언어로 쉽고 빠르게 서버 만들기 33 @source: https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods Http Methods
r *http.Request) { id := r.URL.Query().Get("id") if id == "" { // ID가 비어있을 경우 모든 프로필을 조회 profileList := make([]Profile, 0, len(profiles)) for _, profile := range profiles { profileList = append(profileList, profile) } json.NewEncoder(w).Encode(profileList) return } } read
r *http.Request) { id := r.URL.Query().Get("id") if id == "" { // ID가 비어있을 경우 모든 프로필을 조회 profileList := make([]Profile, 0, len(profiles)) for _, profile := range profiles { profileList = append(profileList, profile) } json.NewEncoder(w).Encode(profileList) return } } read
존재할 경우 해당 ID에 대한 프로필을 조회 profile, ok := profiles[id] if !ok { http.Error(w, "Profile not found", http.StatusNotFound) return } json.NewEncoder(w).Encode(profile)
r *http.Request) { id := r.URL.Query().Get("id") _, ok := profiles[id] if !ok { http.Error(w, "Profile not found", http.StatusNotFound) return } delete(profiles, id) w.WriteHeader(http.StatusOK) } delete
case http.MethodGet: // Serve the resource. case http.MethodPost: // Create a new record. case http.MethodPut: // Update an existing record. case http.MethodDelete: // Remove the record. default: http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) }