2016-08-22 2 views
2

지금 막 Go를 배우기 시작했으며 일부 사항이주의를 끌었습니다.변수를 통해 액세스하는 함수로 이동

기능이 좋아 : 등등

delete(map, "Answer") // for maps 
append(slice, 0) // for slices 
len(slice), cap(slice) // again for slices 

하고 있습니다.

1) 이러한 함수를 변수 자체를 통해 호출 할 수 있습니까 (map.delete("Answer") 에서처럼)?

2) 일반적인 방법 (일반 함수를 정의하고 형식과 수행해야 할 점을 파악할 수 있는지) 또는 기본 제공 형식에 대한 것입니다. 예를 들어, 나는 MyCoolLinkedList처럼, 나는 len을 정의해야하고, 유형 내에서 기능을 추가하고이

list := new(MyCoolLinkedList) 
list.len() 

처럼 전화 또는 내가 좋아하는 목록을받는 함수를 정의한다이, 내 자신의 유형을 정의합니다 :

len(list) 

답변

2

1 - 당신은 예를 들어, 유형 또는 값에 "연결"내장 메서드를 호출 할 수 없습니다

m := map[int]string{1: "one"} 
m.delete(1) 

verify easily 일 수있는 컴파일 타임 오류입니다.

2 - Go doesn't have generics. 그러나 "고통"을 완화하기 위해 여러 유형의 값을 허용 할 수있는 여러 가지 기능을 제공합니다. 왜냐하면 generics가 부족하기 때문에 다른 유형의 값을 받아들이려면 컴파일러의 도움이 필요하기 때문입니다. 일부는 또한 표현식 대신 첫 번째 인수 (예 : make([]int, 1))로 유형을 허용하며 이는 사용자가 작성할 수없는 항목이기도합니다. Builtin 함수에는 표준 Go 유형이 없으며 call expressions에만 나타날 수 있습니다.

다른 유형의 값을 허용하는 함수를 작성할 수 없습니다. 즉, 자신 만의 타입을 만들고 그것을위한 "함수"를 만들 때 헬퍼 (helper) 함수 대신 method으로 선언하는 것이 좋습니다. 마치 "함수"가 당신의 구체적인 유형에서 작동하는 것처럼, 당신은 어쨌든 다른 유형을 위해 그것을 사용할 수 없습니다.

그래서이 방법으로 선언하는 것이 합리적이다, 그리고 당신은 당신이 필요합니다, 유형의 method set으로하는 방법도 "카운트"인 더 "우아하게"

value.Method() 

처럼 호출 할 수 있습니다 예를 들어, 인터페이스를 구현하는 MyCoolLinkedList의 경우 sort.Interface을 구현하면 목록을 정렬 할 수 있습니다. 예를 들어 Len() int 메서드가 필요합니다.

도우미 함수를 통해 메서드를 선택하면 리플렉션을 통해 메서드를 사용할 수 있다는 이점이 있습니다. reflect 패키지를 사용하여 유형의 메소드를 나열하고 호출 할 수 있지만 "그냥"함수로는 동일하게 수행 할 수 없습니다.

관련 문제