Go Pointer指针是什么意思要的知识点有哪些
1. 什么是指针?
指针是存储其指向地址的变量。特定类型的指针只能指向该类型(数据类型不可变)。
2. GoLang 指针语法
指针的语法非常简单。以下是 Go 中指针声明的语法。
var ptr *typevar ptrint *int // 指向 int 的指针
指针的零值是 nil。
3. Go 中指针的初始化
类型的指针使用 &
对其进行初始化:
package mainimport (
"fmt")func main() {
var q int = 42
var p *int // declare the pointer
p = &q // initialize the pointer
fmt.Println(p) // 0x40e020}
4. Go 指针取值
指针取值意味着获取指针保存的地址内的值。下面是使用 *
运算符执行指针取值操作的示例:
package mainimport (
"fmt")func main() {
var q int = 42
var p *int
p = &q
fmt.Println(p) // 0x40e020
fmt.Println(*p) // 42}
5. GoLang 中指针的指针
指针的地址为一个数值,此数值也可以被赋值给其他变量。因此,我们可以创建间接级别。这些间接级别有时会产生不必要的混淆,所以请谨慎使用。
package mainimport (
"fmt")func main() {
i := 64
j := &i // j 是 int 类型的指针
k := &j // k 是存放指针地址的指针,也是 int 类型
fmt.Println(i) // 64
fmt.Println(j) // 0x40e020
fmt.Println(*j) // 64 (value inside that address)
fmt.Println(k) // 0x40c138
fmt.Println(*k) // 0x40e020 (address of j)}
6. 指向接口的指针
指针可以指向任何东西,甚至可以指向接口。当使用空接口时,返回的值为 nil。
package mainimport (
"fmt")func main() {
var a interface{}
b := &a
fmt.Println(b) // 0x40c138
fmt.Println(*b) // <nil>}
下面是一个使用带有指针接口的例子。
package mainimport (
"fmt")// 定义接口type Bird interface{
fly()}type B struct{
name string}// 实现它func (b B)fly() {
fmt.Println("Flying...")}func main() {
var a Bird = B{"Peacock"}
b := &a
fmt.Println(b) // 0x40c138
fmt.Println(*b) // {Peacock}}
这里 “a” 是一个 struct 类型的 Bird,然后用于接口类型,如您所见。这就是多态的使用。Go 允许使用 接口来实现多态. 因此,您可以看到指向结构或接口的指针是 Go 中必不可少的工具。
7. 指针作为函数参数
指针可以在 函数 中作为参数使用。与直接使用值相比,它有一些优势。使用指针作为参数是将大对象传递给函数的一种非常有效的方式。因此,使用它是一个巨大的优化。
package mainimport (
"fmt")//声明指针参数func f(a *int) {
fmt.Println(*a)}func main() {
var a int = 42
// 传递地址
f(&a) // 42}
使用大型对象可以减缓执行时间,这是将指针传递给结构体的示例。这是处理大对象的有效方法。
package mainimport (
"fmt")type Human struct {
name string
age int
place string}func f(h *Human) {
fmt.Println("The user", (*h).name, "is", (*h).age, "years old and he is from", (*h).place)}func main() {
john := Human{"John", 36, "Las Vegas"}
f(&john) // The user John is 36 years old and he is from Las Vegas}
取消引用结构时要小心。如果您使用它像*structname.field1
那么它会抛出错误。 正确的方法是(*structname).field1
。
在函数内部使用指针会使值「可变」,除非它的参数为 const,因此,每当我们想要更改一个值时,我们应该使用指向该值的指针作为函数参数,然后进行必要的修改。
8. Go 中的「new」函数
Go 中的 new 函数返回一个指向类型的指针。
package mainimport (
"fmt")func main() {
ptri := new(int)
*ptri = 67
fmt.Println(ptri) // 0x40e020
fmt.Println(*ptri) // 67}
9. 从函数返回指针
可以像其他值一样从函数返回任何类型的指针。这真的很简单。我们不直接返回值,而是返回该值的地址。
package mainimport (
"fmt")func p() *int { // 将返回类型指定为指针
v := 101
// 返回地址
return &v}func main() {
n := p()
fmt.Println(n) // 0x40e020
fmt.Println(*n) // 101}
10. 指向函数的指针
指向函数的指针在 Go 中是隐式工作的。这意味着我们不需要将其声明为指针。
package mainimport (
"fmt")func main() {
f := func() {
fmt.Println("a function")
}
pf := f pf() // 一个函数}
11. Go 中使用指针要记住的事项
Go 中不允许进行指针运算。因此,我们不能像在 C/C 中那样执行一元递增或递减之类的操作。
我们可能希望使用指向数组的指针,但是使用切片是一个更好的选择。切片比指向数组的指针用途广泛得多。代码非常简洁,让我们的工作更加容易。因此,尽可能使用切片。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tangbhigh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01