구글 go 언어를 공부하면서 몇몇 중요 포인트를 메모중입니다. (2/N)
By SeukWon Kang
그 두번째 입니다. ( 총 몇회가 될지 모르니 2/N 입니다. ^^ )
첫 글은 http://kasw.blogspot.com/2012/09/go.html 를 보시면 됩니다.
Maps key 로 사용 가능한 것은 == , != 이 정의 된 type string,int,float 는 가능 array,slice,struct 는 불가능 pointer, interface 는 가능 struct 를 key로 쓰고 싶으면 Key() 나 Hash() method 를 만들고 그 결과를 키로 사용할것. value 는 아무거나 사용 가능 var map1 map[keytype]valuetype = make( map[keytype]valuetype , capacity ) map1 := map[keytype]valuetype{} map is reference type len(map1) map1[notInMapKey] is zero-value of value type not error val1,isPresent = map1[key1] 형태로 존재하는지 확인 가능 delete(map1, key1) 로 항목을 삭제 가능하면 없는 항목이어도 에러는 없다. Struct no class , use struct type structName struct { fieldName1 fieldType1 “문서나 reflection에서만 보이는 tag 문자열” } fieldname 역시 대소문자로 expose 규칙을 따른다. pointerToStructObj := new(structName) var structObj structName structObj.fieldName1 struct-literal someStructObj := &someStructName{ 10,15, “hello” } // call implicitly new() someStructName{ fieldName1 : fieldValue1 , fieldName2 : fieldValue2 } new(type) equivalent to &Type{} struct 내에 다른 struct를 embedding 할수 있다. 만일 anonymous embedding을 할경우 embeded struct의 field를 접근하는 것이 가능해진다. inheritance 대신 embedding을 하는 것임. type innerS struct { in1 int in2 int} type outerS struct { b int c float32 int // anonymous field innerS // anonymous field, 타입당 하나만 가능 } outer := new(outerS) outer.in2 = 34 // 가능하다. outer.innerS.in2 // 역시 가능하다. outer2 := outerS{6, 7.5, 60, innerS{5, 10}} 같은 이름의 필드가 있으면 outer가 inner를 가린다. 두개의 inner가 같은 이름의 필드가 있으면 error
Method struct는 method를 가질수 있다. ( struct 이외에 type 정의 된것은 모두다 가능 , interface는 불가능 ) method 는 기본적으로 function 따라서 method overloading은 없다. 같은 receiver type의 method는 같은 package에 속해야 하지만 같은 소스 파일에 들어 있어야 하는 것은 아니다. func ( recvObj recvType ) methodName( parameters ) ( return value list ) { } type alias ( type을 정의하는것 ) 하면 각 alias 별로 method 가 따로임. int 나 fload, time.Time 의 method를 정의하는 것은 불가능 ( package가 다르다 ) 하지만 alias 하거나 embedding 하면 가능하게 된다. anonymous type을 struct에 embedding하면 embedded type의 visible method가 사용 가능하게 된다. ( 같은 package면 모두 보인다. ) 이런 방법으로 subclassing이나 inheritance 를 흉내낼수 있다. ( ruby의 mixin 과 거의 같다. ) methon 이름이 같은 경우 embedded 된 type이 가려 지는 것을 이용해서 overriding을 흉내 낼수도 있다 . 가려진 method는 recvObj.embeddedType.methonName() 형태로 호출 가능. 같은 방법으로 multiple inheritance 도 가능. String method를 정의하면 object가 string으로변환되는 모양을 결정해줄수 있다.
runtime.GC() runtime.MemStats.Alloc runtime.SetFinalizer(obj, func(obj *typeObj))
// obj가 GC 되기전 불릴 함수를 지정한다. 정상종료, error 시엔 안 불림.
아직 남았습니다. ;;;