<Hello World 출력하기>
- File 생성
- IDE > File > new > Go file
- 아래 코드 작성
package main import "fmt"
func main() { fmt.Printf("Hello World") } |
---|
- test.go 로 저장
- File 실행
- "Shift" + "F10" > Run
- 출력물 확인
- Build Output 창에 Hello World 뜨면 성공 (exe 파일도 생성됨)
< Go Lang 문법 >
1. 세미콜론(;)은 옵션 (안 쓰는게 일반적임)
2. 중괄호({})의 시작은 항상 같은 줄에.
1 2 3 4 5 6 7 8 | // 가능 func main() { }
// 에러 func main() { } |
3. 들여쓰기는 반드시 탭(Tab) 키를 사용.
4. 주석은 C 스타일 (// 와 /**/)
5. 변수와 상수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // 변수 (사용하지 않으면 컴파일 시 에러) var site string = "google.com" var site = "google.com" // 자료형 생략 가능 site := "google.com" // :을 이용해서 var 없이 변수 선언 가능 var userCount int = 1
// 상수 const userCount int = 1
// 한번에 선언 가능 var ( site string ="google.com" author string = "Juseok Yun" userCount int = 100 ) print(site + ":" + author + ":" + strconv.Itoa(userCount)) // "strconv" Import 필요 |
6. 연산자(+, -, *, /, …)도 C 스타일 (산술, 비교, 비트)
– 대입연산자는 := 하나 더 추가
7. 채널 (Channel)
– 고루틴(go 함수명())이 서로 통신하고 변수를 동기화할 수 있는 수단.
– Go의 동시성(concurrency) 관련해서 학습 필요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | package main
import ( "fmt" "os" )
var print = fmt.Println
func add(a int, b int, c chan int) { c <- a + b }
func main() { var c = make(chan int) go add(1, 3, c) // 고루틴 실행 print(<-c)
// 일시 정지를 위해 var b []byte = make([]byte, 1) os.Stdin.Read(b) } |
8. 포인터
– C와 유사함 (단, new 키워드 사용 가능)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | package main
import ( . "fmt" // .을 사용하면 fmt.으로 안 써도 됨 WonHada "os" // 닉네임을 줄 수도 있음 )
func add(a int, b int, c *int) { *c = a + b }
func main() { var c int add(1, 3, &c) Println(c) // Println 바로 사용
d := new(int) add(1, 4, d) Println(*d)
// 일시 정지를 위해 var b []byte = make([]byte, 1) WonHada.Stdin.Read(b) // 닉네임 사용 } |
9. 조건문은 C 스타일 (if, switch)
– 단, switch문이 좀 특이함
– switch문에 break 생략 가능
– case를 연속으로 여러개 사용 불가 (break를 생략할 수 있는 이유)
– fallthrough 키워드: 조건에 맞는 case 다음 case 무조건 실행
1 2 3 4 5 6 7 8 9 10 | switch *d { case 5: println("******") fallthrough case 6: println(*d) fallthrough case 7: print("=======") } |
10. 반복문은 for만 존재, C 스타일
– for i := 0; i < 10; i++ { } - while문 대신 아래 코드처럼 사용
1 2 3 4 5 6 | rand.Seed(int64(time.Now().Nanosecond())) // "math/rand"와 "time" Import 필요 i := rand.Intn(10) for i == 5 { println("무한도전") } |
11. 배열
1 2 3 4 5 | var arr [3]string = [3]string{"Hello", "Golang", "World"} // 배열 var slice []string = []string{"Hello", "Golang"} // 슬라이스 (크기없는 배열) slice = append(slice, "World") // 마지막 요소 추가 slice = slice[1:] // 첫 번째 요소 제거 fmt.Println(arr[0], strings.Join(slice, " ")) |
12. 맵
1 2 3 4 5 6 7 | // _map := map[string]string { // 아래와 같음 var _map map[string]string = map[string]string { "name": "Kangmin Won", "country": "Korea", "company": "http://theboud.com", } fmt.Println(_map["name"]) |
13. 함수
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | package main
import ( "fmt" "os" )
func getCompany() string { return "http://theboud.com" }
func getName() (string, string) { return "Kangmin", "Won" }
func getCountOfChildren() (count int) { count = 2 return }
func main() { fmt.Println(getCompany()) fmt.Println(getName()) fmt.Println(getCountOfChildren())
// 일시 정지를 위해 var b []byte = make([]byte, 1) os.Stdin.Read(b) // 닉네임 사용 } |
14. 구조체, 인터페이스
– 클래스는 없고 구조체를 이용함
– 인터페이스의 사용법이 특이함
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | package main
import ( "fmt" "os" )
// 구조체 type Circle struct { x float64 y float64 r float64 }
//---------- 클래스는 없고 아래와 같이 사용 ----------// type Rectangle struct { width float64 height float64 }
// 메소드 func (rect Rectangle) getWidth() float64 { return rect.width }
//----------------------------------------------// // 인터페이스 (동일한 메소드를 구현한 구조체의 객체를 넘겨서 사용) type Primitive interface { getWidth() float64 // getHeight() float64 // Rectangle은 이 함수가 없으므로 사용할 수 없음 }
func main() { var c Circle = Circle{x: 1, y: 2, r: 3} fmt.Println(c.r)
c2 := Circle{2, 4, 8} fmt.Println(c2.r)
rect := Rectangle{100, 200} fmt.Println(rect.getWidth())
p := Primitive(rect) fmt.Println(p.getWidth())
var p2 Primitive = rect
fmt.Println(p2.getWidth())
// 일시 정지를 위해 var b []byte = make([]byte, 1) os.Stdin.Read(b) // 닉네임 사용 } |