>  기사  >  백엔드 개발  >  Go 언어에서 함수는 무엇을 의미하나요?

Go 언어에서 함수는 무엇을 의미하나요?

青灯夜游
青灯夜游원래의
2022-12-08 19:48:396122검색

Go 언어에서 함수는 단일 특정 또는 관련 기능을 구현하는 데 사용되는 체계적이고 재사용 가능한 코드 세그먼트(블록)입니다. 주요 목적은 애플리케이션의 모듈화 및 코드 재사용률을 향상시키는 것입니다. 관리 및 모듈 개발. 함수는 일반적으로 매개변수와 반환값을 사용하여 호출자와 상호작용합니다. 매개변수는 데이터를 함수에 전달하고, 값을 반환하며, 함수는 처리된 데이터를 호출자에게 전달합니다.

Go 언어에서 함수는 무엇을 의미하나요?

이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.

Function은 단일 또는 관련 기능을 구현하는 데 사용되는 체계적이고 재사용 가능한 코드 세그먼트로, 애플리케이션의 모듈성과 코드 재사용률을 향상시킬 수 있습니다.

함수 개요

함수, 함수, 특정 기능을 구현하는 데 사용되는 독립적인 코드 블록입니다. 주요 목적은 코드 재사용(재사용), 더 나은 코드 관리 및 모듈 개발입니다. 함수는 일반적으로 매개변수와 반환값을 사용하여 호출자와 상호작용합니다. 매개변수는 데이터를 함수에 전달하고 값을 반환하며, 함수는 처리된 데이터를 호출자에게 전달합니다. Go 언어의 함수를 일급 시민이라고 합니다. 고차함수, 익명함수, 클로저 등의 기능을 지원하며, 인터페이스 등 고급함수 기능을 충족할 수 있다는 뜻이다.

함수 정의

함수는 코드 실행의 논리적 구조를 구성합니다. Go 언어에서 함수의 기본 구성 요소는 키워드 func, 함수 이름, 매개변수 목록, 반환 값, 함수 본문 및 반환 문입니다. 프로그램에는 많은 함수가 포함되어 있으며 함수는 코드의 기본 블록입니다.

구문:

  • 정의:

func 函数名(形参列表)(返回值类型列表) {
  函数体,通常会有return语句,返回值
}
  • Call:

函数名(实参列表)

함수 이름: 함수를 찾는 데 사용되는 함수의 식별자이며 내부에는 함수를 가리키는 주소가 있습니다. 암호. 형식적 매개변수 목록: 변수와 ​​유형으로 구성됩니다. 반환 값 유형 목록: 함수 반환 값의 유형을 지정해야 합니다. 함수 본문: 함수를 구현하는 특정 문입니다. return 문: return value 문

위는 명명된 함수이므로 다른 함수 내부에서 정의할 수 없습니다.

함수 매개변수

는 함수를 호출할 때 함수에 데이터를 전달하는 데 사용됩니다. 실제 매개변수, 실제 매개변수. 호출 시 제공되는 매개변수입니다. 특정 실제 데이터가 포함된 매개변수를 나타냅니다. 형식 매개변수, 형식 매개변수. 정의할 때 사용되는 매개변수입니다. 이는 함수에 매개변수가 필요하지만 매개변수를 정의할 때 매개변수에 실제 데이터가 없다는 의미입니다. 호출 시 실제 매개변수를 이용하여 형식적 매개변수 변수에 값을 할당하는 과정이 일어나는데, 이를 매개변수 전달(parameter pass)이라고 한다. 함수 실행 중에 형식 매개변수에는 특정 데이터가 있으며 형식 매개변수는 함수 내에서 선언된 변수와 동일합니다.

파라미터 전송은 값 전송과 주소 전송의 두 가지 방법으로 구분됩니다. 주소를 전달할 때 형식 매개변수를 포인터형으로 정의하고, 호출 시 주소 매개변수를 얻어야 한다. 샘플 코드:

func funcTest(p1 int, p2 *int) {
  p1++
  *p2++
  fmt.Println(p1, *p2)
}
func main() {
  var (
    a1 = 42
    a2 = 42
  )
  funcTest(a1, &a2)
  // 参数赋值过程
  fmt.Println(a1, a2)
}

위에서는

43 43
42 43

값이 전달되고 함수는 실제 매개변수의 복사본을 가져옵니다. 주소가 전달되면 함수는 실제 매개변수 주소를 가져오므로 함수의 주소를 통한 변수 수정도 실제 매개변수에 영향을 미칩니다.

Go에서는 무기한 개수의 매개변수를 지원합니다. 정의할 때 형식 매개변수 목록 끝에 무기한 개수의 매개변수를 배치하고 ...Type을 사용하세요. 데모:

定义:
func funcTest(op string, nums ...int) {
  fmt.Println(nums) // [4, 1, 55, 12], slice切片型数据
}
调用
funcTest("someOp", 4, 1, 55, 12)

수신된 매개변수는 슬라이스 유형입니다. .

함수 반환 값

return 문은 반환 값을 생성하는 데 사용됩니다. 반환 값 유형은 함수 정의 시 결정되어야 하며 다중 값 반환이 지원됩니다. 데모 구문:

func funcTest() (int, string) {
  return 42, "Hank"
}

정의할 때 반환된 변수를 선언할 수 있습니다. 이 메소드를 return이라고 하며 데모는 다음과 같습니다.

func funcTest() (num int, title string) {
  num = 42
  title = "Hank"
  return
}

데이터를 반환할 필요가 없으며 직접 반환하면 됩니다!

함수 변수

함수는 다른 유형과 마찬가지로 변수에 저장할 수 있는 특별한 포인터 유형으로 간주될 수 있습니다. 함수 식별자와 변수를 통해 함수에 액세스할 수 있습니다. 데모는 다음과 같습니다.

func funcTest() {
  fmt.Println("func() type")
}
func main() {
  fmt.Printf("%T, (%v)\n", funcTest, funcTest)
  fn := funcTest
  fmt.Printf("%T, (%v)\n", fn, fn)
  funcTest()
  fn()
}

실행 결과:

func(), (0x48fe20)
func(), (0x48fe20)
func() type
func() type

함수 식별자가 함수에 대한 포인터임을 알 수 있습니다. 다른 변수에 할당될 수 있습니다.

함수 매개변수

함수는 다른 함수의 매개변수로도 사용할 수 있습니다. 데모는 다음과 같습니다.

func funcSuccess() {
}
func funcAsync(handle func()) {
  // 调用函数参数
  handle()
}
// 传递函数到其他函数
funcAsync(success)

콜백 함수를 사용하는 이 구문은 비동기 논리를 처리할 때 매우 유용합니다.

익명 함수

익명 함수를 정의할 수 있습니다. 익명 함수는 변수에 저장되거나, 인수로 전달되거나, 즉시 호출될 수 있습니다. 함수를 일시적으로 사용하는 경우 익명 함수를 선택하는 것이 좋습니다. 구문 예:

赋值给变量
fn := func() {
}
fn()

// 作为参数
someFunc(func() {
  })

// 立即调用
func() {
  }()

Closure

由于匿名函数可以定义在其他函数内,同时变量的作用域为层叠的,也就是匿名函数可以会访问其所在的外层函数内的局部变量。当外层函数运行结束后,匿名函数会与其使用的外部函数的局部变量形成闭包。示例代码:

var fn func()
func outer() {
  v := 42
  fn = func() {
    v ++
    fmt.Print(v)
  }
}

outer()
fn() // 43

此例中,fn 对应的匿名函数与 outer() 的局部变量 v,就形成了闭包。

函数调用示意图

var v = "global"
func funcTest(v) {
  v = "funcTest"
  fmt.Println(v)
}
func main() {
  v := "main"
  funcTest(v)
}

代码编译期间,会将函数代码存放在内存代码区。 函数被调用时,在运行期间会在函数运行栈区开辟函数栈,内部由局部变量标识符列表(就是局部变量),上层标识符列表引用等信息。直到运行结束,此空间才会被出栈,释放。 函数内部调用了新函数,新函数的执行空间入栈,要等到新函数执行空间出栈,调用他的函数才会被出栈。 以上代码的运行逻辑图如下:

Go 언어에서 함수는 무엇을 의미하나요?

递归调用

函数内部调用函数本身。称之为递归调用。示例代码:

func funcTest() {
  fmt.Println("run")
  funcTest()
}

定义实现递归调用函数时,通常需要定义一个出口。用来确定何时不再进行递归调用了。一旦满足条件,则调用停止。例如:

func funcTest(v) {
  fmt.Println(v, "run")
  v ++
  if v <= 10 {
    funcTest()
  }
}

典型的应用有,树状菜单的处理,遍历目录,快速排序等。 递归调用的优势是编码简单,与描述的业务逻辑保持一致。

【相关推荐:Go视频教程

위 내용은 Go 언어에서 함수는 무엇을 의미하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.