Golang math 패키지 Floor에 함수체 없음

2458 단어 Golang
우연히 math 패키지 아래의 일부 함수를 측정하려고 했는데 math 패키지에서 도출된 함수에 함수체가 없다는 것을 발견했다. 나는 이 코드를 따라 내 자신의 것이다.go 파일에서 오류 보고missing function body.
코드는 다음과 같습니다.
// Trunc returns the integer value of x.
//
// Special cases are:
//    Trunc(±0) = ±0
//    Trunc(±Inf) = ±Inf
//    Trunc(NaN) = NaN
func Trunc(x float64) float64

func trunc(x float64) float64 {
    if x == 0 || IsNaN(x) || IsInf(x, 0) {
        return x
    }
    d, _ := Modf(x)
    return d
}

두 가지 질문:
  • func Trunc(x float64) float64 이런 문법은 무엇인지, 어디서 나온 문법, 출처가 무엇인지
  • 아래에 이미 실현된 미도출 함수func trunc(x float64) float64 {...}와 이 함수는 어떤 관계입니까
  • 무엇


    먼저 이것이 무엇인지 설명한다. 사실 이것은 함수 성명이다. 진정한 함수 주체는 어셈블리로 이루어진 것이다. 만약에 원본 코드를 보면 이 함수는math 패키지 아래의floor에서 나온다.go 파일, 이 파일이 있는 폴더에는 다음과 같은 파일이 있습니다.
    floor_386.s
    floor_amd64.s
    floor_amd64p32.s
    floor_arm.s
    floor_arm64.s
    floor_ppc64x.s
    floor_s390x.s
    floor_wasm.s
    

    floor.go의 함수 성명은 모두 어셈블리 파일에서 이루어진 것이다
    문법의 출처는 Golangspec을 참고하는 것으로 원리는
    A function declaration may omit the body. Such a declaration provides the signature for a 》 function implemented outside Go, such as an assembly routine.
    func min(x int, y int) int {
    if x < y {
       return x
       }
       return y
    }
    
    func flushICache(begin, end uintptr)  // implemented externally
    

    함수 성명은 본문을 생략할 수 있다는 뜻이다.이러한 성명은 Go 이외에 이 함수를 실현하기 위해 서명을 제공했다. 예를 들어 어셈블리 프로그램이다.

    연관성

    func trunc(x float64) float64 {...} 이 성명과 무슨 관계가 있습니까?
    참고 링크의 해석에 의하면 이것은 Golang의 예비 실현이다. 예를 들어 floorarm.s에서 Trunc를 실현할 때 오히려 골롱의 실현을 호출하여 참고와 테스트로 사용할 수 있다.
    floor_arm.s
    #include "textflag.h"
    
    TEXT ·Floor(SB),NOSPLIT,$0
        B    ·floor(SB)
    
    TEXT ·Ceil(SB),NOSPLIT,$0
        B    ·ceil(SB)
    
    TEXT ·Trunc(SB),NOSPLIT,$0
        B    ·trunc(SB)
    

    여기 있는 .trunc 등은 바로 호출된 골랑이 실현한 거예요.
    참조 링크:
    Bodiless function in Golang
    golang spec - function declarations

    좋은 웹페이지 즐겨찾기