Hubungan halus antara alamat fungsi Golang dan penunjuk

WBOY
Lepaskan: 2024-04-08 16:45:02
asal
512 orang telah melayarinya

Alamat fungsi menghala ke alamat memori fungsi itu sendiri, manakala penuding menghala ke alamat memori pembolehubah atau struktur. Walau bagaimanapun, alamat fungsi juga boleh disimpan dalam penunjuk, membolehkan kami memanggil fungsi melalui penunjuk. Konsep ini berguna dalam pelbagai senario, seperti memanggil fungsi secara dinamik atau mencipta fungsi panggil balik.

Golang 函数地址与指针的微妙关系

Alamat dan penuding fungsi dalam Go: perhubungan halus

Dalam bahasa Go, alamat fungsi dan penuding nampaknya serupa, tetapi terdapat perbezaan yang ketara antara keduanya. Memahami perbezaan mereka adalah penting untuk menulis kod yang cekap dan boleh diselenggara.

Alamat fungsi

Alamat fungsi ialah alamat yang menunjuk ke lokasi memori fungsi itu sendiri. Ia boleh diperolehi melalui literal func yang dijana pengkompil atau fungsi ValueOf atau Func dalam pakej reflect. func 字面字或 reflect 包中的 ValueOfFunc 函数获取。

指针

指针是一个存储另一个值地址的变量。在Go中,指针可以通过 * 符号和类型名称声明。例如,*int 是一个指向整数值的指针。

它们之间的关系

函数地址和指针指向不同的东西。函数地址指向函数本身的内存地址,而指针指向变量或结构的内存地址。但是,函数地址也可以存储在指针中。

在以下示例中:

func myFunc() {}
var fptr = &myFunc
Salin selepas log masuk

fptr 是一个指针,指向函数 myFunc

Penunjuk

Penunjuk ialah pembolehubah yang menyimpan alamat nilai lain. Dalam Go, penunjuk boleh diisytiharkan melalui simbol * dan nama jenis. Contohnya, *int ialah penunjuk kepada nilai integer.

Hubungan antara mereka

🎜🎜Alamat fungsi dan penunjuk menunjuk kepada perkara yang berbeza. Alamat fungsi menunjuk ke alamat memori fungsi itu sendiri, manakala penunjuk menunjuk ke alamat memori pembolehubah atau struktur. Walau bagaimanapun, alamat fungsi juga boleh disimpan dalam penunjuk. 🎜🎜Dalam contoh berikut: 🎜
(*fptr)() // 等同于 myFunc()
Salin selepas log masuk
🎜fptr ialah penunjuk yang menunjuk ke alamat fungsi myFunc. Ini membolehkan kami memanggil fungsi melalui penunjuk: 🎜
package main

import (
    "fmt"
    "math"
)

// 计算半径的函数
func radius(n int) float64 {
    return float64(n) / 2.0
}

// 求一个数字的根的函数
func sqrt(n int) float64 {
    return math.Sqrt(float64(n))
}

var operations = map[string]func(int) float64{
    "radius": radius,
    "sqrt":    sqrt,
}

func main() {
    input := "sqrt"
    num := 9

    // 通过名称获取函数指针
    op := operations[input]

    // 调用函数并打印结果
    fmt.Println(op(num))
}
Salin selepas log masuk
🎜🎜Contoh Praktikal🎜🎜🎜Alamat dan penunjuk fungsi berguna dalam pelbagai senario. Berikut ialah contoh praktikal yang menggunakan konsep ini: 🎜rrreee🎜 Contoh ini menunjukkan cara menyimpan alamat fungsi dalam kamus dan memanggilnya secara dinamik mengikut nama fungsi semasa masa jalan. 🎜

Atas ialah kandungan terperinci Hubungan halus antara alamat fungsi Golang dan penunjuk. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!