구글 go 언어를 공부하면서 몇몇 중요 포인트를 메모중입니다. (1/N)
By SeukWon Kang
다음 프로젝트에 go 언어를 쓸 생각이어서 공부하는 김에 몇가지 중요 포인트들을 메모 하고 있습니다. 원래는 다 끝나면 한꺼번에 블로그에 올리려고 했는데 적다보니 양이 많아져서 일단 앞부분만 먼저 정리합니다.
주의 할 것은 제가 보기 위해 적은 것이라 기본적으로 C/C++/java/C# 에대한 지식과 추가로 python 같은 스크립트언어도 안다고 가정한 상태에서 적은 것입니다. 게다가 go 언어의 구체적인 syntax 에 대해서도 http://golang.org/ref/spec 같은 곳에서 한번 정도 읽어 봤다고 가정합니다. ( 조건이 너무 까다롭군요. ;; )
소스 코드의 구성 소스 코드는 utf8임 identifier 를 utf8로 만들수 있다 . 모든 소스파일은 package에 포함 main package의 main function 에서 시작 : main.main() package의 하나의 init() function 이 존재 여러 소스코드가 하나의 package 를 구성할수 있다. Function 정의 순서는 필요 없음 소스 코드는 case-sensitive 임 . 모든 { 은 라인의 끝에 } 은 시작 statement의 맞춰서 indent : 강제 사항임. 사용하지 않는 변수 , import는 compile error package 외부로 expose하려면 첫 글자를 대문자로 : ExposedIdentifier , notExposedIdentifier semicolon 은 선택적 : 여러 statement를 한라인에 쓰려면 필요. 전반적 언어적 특징 모든 변수/오브젝트는 항상 초기화 된다. 0, nil, 0.0 overloading은 없다. Inheritance 역시 없다. Implicit conversion 역시 없다. String 은 byte array 로 utf8로 encoded 된다. String 은 length 가 포함 , immutable pointer / reference가 존재하나 arithmetic은 불가 function은 first-class value : 타입/변수를 선언하거나 인자로 넘길수 있다. 더미 변수(blank identifier ) _ 가 존재 사용하고 싶지 않은 결과값을 무시할때 사용 : write only Statement , control flow, function Function can return multiple value, assignment 역시 가능 result , err := somefunction() switch case는 default 가 break ( 즉 쓸필요 없음 ) , 아니면 fallthrough 를 사용 할것 ( C style 이됨 ) label 은 goto,break,continue 용 , 안쓰는 label 역시 error 임. function의 return 선언에 이름을 주면 (named return value ) return statement 에서 그 변수의 현재 값을 return 한다. func getX2AndX3_2(input int) (x2 int, x3 int) { return } 물론 명시적으로 지정해서 return 할수도 있다. function call 은 기본적으로 call by value , call by reference를 쓰고 싶으면 &와 *를 사용할것. variable number of parameters (variadic parameter ) 는 variablename …type 형태로 정의 for _,v := range variablename 형태로 사용. defer를 사용해서 function 의 종료직전에 실행할 statement를 예약 할수 있다. ( LIFO 순 ) : return 다음에 실행됩니다. Array and slice array 의 길이는 type의 일부 이며 선언할때 꼭 필요(at compile time) .: [5]int.(type) != [10]int.(type) var arr1 [5]int // type [5]int var arr1 = new([5]int) // type *[5]int array 는 value type , slice 는 reference type array는 1-dimensional : composed to form multidimensional arrays , rectangular slice can non-rectangular zero based index max length 2G : var intarray1 [5]int array의 내용물은 mutable for i:=0 i < len(arr1) ; i ++ { } for i,v := range arr1 { } 형태로 enumeration 한다. : slice에 대해서도 가능 var arrAge = [5]int{18, 20, 15, 22, 16} var arrLazy = […]int{5, 6, 7, 8, 22} // var arrLazy = []int{5, 6, 7, 8, 22} // slice var arrKeyValue = [5]string{3: “Chris”, 4: “Ron”} //var arrKeyValue = []string{3: “Chris”, 4: “Ron”} // slice slice는 그 아래에 있는 (unnamed) array의 표시되는 windows 다. cap(s)는 s가 가리키는 array의 끝까지의 양을 표시 : len(arr1) 보다 작거나 같다. 여러 slice가 같은 array를 가리킬수 있다. : data가 공유됨. var slice1 []int = arr1[3:7] 형태 slice1[0] == arr1[3] slice1 == slice1[:i] + slice1[i:] len(slice1) <= cap(slice1) index로 - 는 불가능 var slice1 []type = make([]type, len,cap) 어쩐지 쓰면 쓸수록 한글이 적어 지는 것 같지만 기분 탓 입니다. ;;;