Golang "일등 시민"- 함수 (function)
Golang 일등 시민 - 함수(function)
1. "일등 공민(first Class)" 함수
2. 성명 함수: 일반 함수는 반드시 먼저 성명해야 호출할 수 있다
일반 함수 선언 규칙
함수 기본 구조 형식:func 함수 이름 (인자 목록) (반환값 목록) {함수체}
3. 호출 함수: 코드 사이의 이동
함수는 정의된 후에 호출된 방식을 통해 현재 코드를 호출된 함수로 옮겨 실행합니다.호출된 함수 (호출 전 함수) 국부 변수가 저장되어 분실되지 않습니다.호출된 함수가 끝나면 호출된 함수의 다음 줄로 되돌아와 코드를 계속 실행합니다. 이전의 국부 변수도 계속 접근할 수 있습니다.소결: 함수의 국부 변수는 함수 내에서만 사용할 수 있고 호출이 끝나면 이 국부 변수들은 모두 방출되고 효력을 상실한다(GC 회수).
Go 언어에서 함수 호출 형식:
반환값 변수 목록 = 함수 이름(매개 변수 목록)
4. 매개 변수 전달 - Golang의 모든 매개 변수는 값 전달
Go 언어에서 전송 및 반환 매개 변수는 호출 및 반환 시 값을 사용하여 전달됩니다.우리가 주의해야 할 것은 슬라이스 (slice), 포인터 (pointer), 맵 (map) 등 인용형 대상이 가리키는 내용은 매개 변수 전달에서 복제되지 않고 포인터를 복제하는 것이다. 인용을 만드는 것과 유사하다.즉 매개 변수 전달 과정에서 실제 복제된 주소 (포인터) 는 인용 유형이 가리키는 내용을 복제하지 않았다.코드 실행 아래:
type Data struct {
complex []int // slice
instance InnerData // innerdata
ptr *InnerData //
}
//
type InnerData struct {
a int
}
func passByValue(inFunc Data) Data {
//
fmt.Printf("inFunc value %+v:
", inFunc)
fmt.Printf("inFunc ptr:%p
", &inFunc)
return inFunc
}
func TestInfunc(t *testing.T) {
in := Data{
complex: []int{2, 4, 9},
instance: InnerData{
7,
},
ptr: &InnerData{5},
}
//
t.Logf("in value:%+v", in)
t.Logf("in ptr:%p", &in)
//
out := passByValue(in)
t.Logf("out value:%+v", out)
t.Logf("out ptr:%p", &out)
}
//Run Result:
=== RUN TestInfunc
inFunc value {complex:[2 4 9] instance:{a:7} ptr:0xc000044170}:
inFunc ptr:0xc000058420
--- PASS: TestInfunc (0.00s)
DataTrasfer_test.go:38: in value:{complex:[2 4 9] instance:{a:7} ptr:0xc000044170}
DataTrasfer_test.go:39: in ptr:0xc000058390
DataTrasfer_test.go:42: out value:{complex:[2 4 9] instance:{a:7} ptr:0xc000044170}
DataTrasfer_test.go:43: out ptr:0xc0000583f0
PASS
위의 결과에서 발견:
5. 함수 변수 - 함수를 값으로 변수에 저장
Go에서도 함수는 하나의 유형으로 간주되므로 기본 유형과 같이 변수에 저장될 수 있습니다.
func hello(str string) string {
return str
}
func TestFuncVar(t *testing.T) {
//
var f func(string) string
//
f = hello
t.Log(f("Golang"))
}
//Run restult:
=== RUN TestFuncVar
--- PASS: TestFuncVar (0.00s)
FuncVar_test.go:17: Golang
PASS
상기에서 보듯이 함수를 값으로 함수 변수에 전달하고 이 특성을 이용하여 함수를 각 유형의 변수에 부여할 수 있다. 예를 들어 데이터의 처리 함수를 절편 유형의 함수 변수에 부여하고 데이터에 대해 체인식 처리를 할 수 있다.
6. 익명 함수 - 이름이 없는 일반 함수
익명 함수 성명, 호출
func TestUnamefunDir(t *testing.T) {
// s
s := func(a string) string {
return a
}("hello")
t.Log(s)
}
/* === RUN TestUnamefunDir --- PASS: TestUnamefunDir (0.00s) Unamefunc_test.go:10: hello PASS */
주의: 익명 함수의 마지막} ("hello") 는 익명 함수를 직접 호출합니다.
func TestUnamefunVar(t *testing.T) {
//
s := func(a string) string {
return a
}
// s()
t.Log(s("hello"))
}
/* === RUN TestUnamefunVar --- PASS: TestUnamefunVar (0.00s) Unamefunc_test.go:25: hello PASS */
위의 설명과 함께 익명 함수를 직접 호출하여 구분합니다. 전자는 익명 함수의 반환값을 변수 s에 부여하고, 후자는 익명 함수를 함수 변수 s에 부여합니다.
익명 함수 리셋 함수 실현
슬라이스에 대한 반복을 통해 익명 함수를 리셋 함수로 실현합니다.동시에 서로 다른 리셋 함수는 절편에 대한 서로 다른 반복 조작을 실현할 것이다.
func Range(list []int, f func(int)) { //slice
for _, v := range list {
f(v)
}
}
func TestRangeList(t *testing.T) {
Range([]int{1, 2, 5, 9}, func(b int) { //slice
t.Log(b)
})
}
/* === RUN TestRangeList --- PASS: TestRangeList (0.00s) Unamefunc_test.go:49: 1 Unamefunc_test.go:49: 2 Unamefunc_test.go:49: 5 Unamefunc_test.go:49: 9 PASS */
익명 함수 구현 조작 봉인
행위에 대한 정의를 통해 익명 함수를 맵의 키 값으로 하고 이를 통해 명령의 하위 명령을 실현할 수 있습니다.
//
func TestUnameFuncPatch(t *testing.T) {
behavior := map[string]func(){
"walk": func() {
t.Log("Go Walking")
},
"fly": func() {
t.Log("Go Flying")
},
"jump": func() {
t.Log("Go Jumpping")
},
}
do := []string{"walk", "fly", "jump", "play"}
for i := range do {
if f, ok := behavior[do[i]]; ok {
f()
} else {
t.Log("NO Behavior!")
}
}
}
/* === RUN TestUnameFuncPatch --- PASS: TestUnameFuncPatch (0.00s) Unamefunc_test.go:68: Go Walking Unamefunc_test.go:71: Go Flying Unamefunc_test.go:74: Go Jumpping Unamefunc_test.go:83: NO Behavior! PASS */
함수성명 함수호출 함수 매개 변수 전달함수를 값으로 저장익명 함수
익명 함수 성명 호출 익명 함수 리셋 함수 실현 익명 함수 구현 조작 봉인익명 함수 - 공장 모드
함수를 인터페이스로 사용총결을 배우고 끊임없이 실천하며 지식을 나눈다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Golang 구현 대기열 및 스택대기열: 스택: github 주소:https://github.com/golibec/Lstruct.git 후속적으로 각종 데이터 구조와 주류 알고리즘을 지속적으로 보완할 것이다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.