当前位置: 首页 > news >正文

怎么样可以做网站充值代理排名轻松seo 网站推广

怎么样可以做网站充值代理,排名轻松seo 网站推广,个人网站取域名,班服定制的网站目录 概述 一、基本概念 指针类型(Pointer type) 非引用类型(值类型) 引用类型(Reference Types) 解引用(dereference) 二、引用类型和非引用类型的区别 三、golang数据类型…

目录

概述

一、基本概念

指针类型(Pointer type)

非引用类型(值类型)

引用类型(Reference Types)

解引用(dereference)

二、引用类型和非引用类型的区别

三、golang数据类型系统里的引用类型和非引用类型

值类型(Value Types)

引用类型(Reference Types)

四、golang数据类型系统里的零值

五、Methods and pointer indirection

情况1:函数的形参是值类型,实参是值类型的处理情况

情况2:函数的形参是值类型,实参是指针类型的处理情况

情况3:函数的形参是指针类型,实参是值类型的处理情况

情况4:函数的形参是指针类型,实参是指针类型的处理情况

情况5:方法的接收者是值类型,方法的调用者是值类型的处理情况

情况6:方法的接收者是值类型,方法的调用者是指针类型的处理情况

情况7:方法的调用者是指针类型,方法的调用者是值类型的处理情况

情况8:方法的调用者是指针类型,方法的调用者是指针的处理情况

总结


概述

        本文主要介绍引用类型和非引用类型的基本概念,golang的数据类型系统里有哪些是引用类型和非引用类型,以及引用类型和非引用的区别,他们的优缺点,尤其重点介绍了golang的“Methods and pointer indirection”的含义,指针类型和值类型在函数参数传递和方法调用方面的区别。

一、基本概念

        编程语言中,引用类型和非引用类型(有时也被称为值类型)是两种主要的数据类型分类方式,它们主要区别在于数据在内存中的存储和传递方式。

指针类型(Pointer type)

        指针类型是指能够存储变量地址的数据类型。在 Go 中,使用 *T 表示指向 T 类型的指针,其中 T 是任意类型。指针类型允许我们直接操作变量的内存地址,可以用来传递变量的引用,以及在需要时间接访问变量的值。例如,*int 表示指向整数类型的指针。

非引用类型(值类型)

        非引用类型,也称为值类型,在创建变量时,会在内存中分配一个新的存储空间来存储该变量的值。每个值类型的变量都有自己独立的存储空间,并且变量的值会被直接复制。当你将一个值类型的变量赋值给另一个变量时,实际上是创建了这个值的一个副本。对副本所做的任何修改都不会影响原始变量。因此,值类型的变量在函数参数传递时也是按值传递的。在Go语言中,基本数据类型(如int、float64、bool、string等)和数组都是值类型。

引用类型(Reference Types

        引用类型在创建变量时,并不会在内存中直接存储数据本身,而是存储一个指向数据的引用(或指针)。这个引用是一个地址,指向在堆内存中存储的实际数据。多个引用类型的变量可以指向同一个数据。当你将一个引用类型的变量赋值给另一个变量时,你其实是在复制这个引用,而不是数据本身。因此,所有指向同一个数据的引用类型变量都会共享这个数据

解引用(dereference)

      解引用是指通过指针获取其所指向的值。换句话说,解引用是一种操作,允许我们通过指针变量访问和修改变量或对象的值。通过使用*操作符,我们可以对指针变量进行解引用操作,获取其所指向的值。

        解引用不仅适用于基础数据类型,也适用于结构体等复合类型。例如,我们可以解引用一个指向结构体的指针,以访问或修改结构体的字段。

需要注意的是golang对未初始化的引用类型,进行解引用操作会引发运行时错误(panic)。这是因为未初始化的引用类型变量在内存中没有有效的值或地址,尝试解引用这样的变量将导致未定义的行为

二、引用类型和非引用类型的区别

三、golang数据类型系统里的引用类型和非引用类型

        在 Go 语言中,类型可以分为值类型和引用类型。这两种类型的主要区别在于它们在内存中的存储方式和赋值操作的行为

值类型(Value Types)

值类型包括:

  1. 基本数据类型:如 intfloat64boolstringcomplex64complex128rune(即 int32 的别名,用于表示 Unicode 码点)等。

  2. 数组:数组是固定长度的序列,每个元素都是相同类型的值。例如 [5]int

  3. 结构体:结构体是由一组字段组成的值类型。字段可以具有不同的类型。

对于值类型的变量,赋值操作会创建该值的副本。这意味着如果你修改了一个值类型变量的值,它不会影响其他使用该类型值的变量。

引用类型(Reference Types)

引用类型包括:

  1. 切片:切片是对数组的抽象,它提供了动态长度的、灵活且可变的序列。切片底层引用了数组的一部分或全部,但它本身是一个独立的类型。

  2. 映射:映射是键值对的集合。Go 语言中的映射类型使用 map 关键字定义,例如 map[string]int

  3. 通道:通道用于在 Go 语言的并发程序中传递数据。它们用于实现协程之间的通信。

  4. 接口:接口定义了一组方法的集合,任何实现这些方法的具体类型都被认为实现了该接口。接口本身不存储数据,但可以作为引用类型传递。

  5. 函数:在 Go 语言中,函数也可以被视为值,可以赋值给变量,也可以作为参数传递给其他函数。尽管函数在内存中的表示与常规的值类型略有不同,但在许多上下文中,它们的行为类似于引用类型。

四、golang数据类型系统里的零值

        在 Go 语言中,当声明一个变量但未对其进行赋值时,该变量会被赋予其对应类型的零值。零值是指变量在未被显式赋值时的默认值。下面是 Go 语言中常见类型的零值: 

 

五、Methods and pointer indirection

        前面的铺垫其实我们为了更好地理解“Methods and pointer indirection”。什么是“Methods and pointer indirection”

  • functions with a pointer argument must take a pointer
  • while methods with pointer receivers take either a value or a pointer as the receiver when they are called

为了更好地理解上面这段话,我将问题进行了拓展,即值类型和引用类型在函数传递和方法调用的不同情况下golang编译器的处理方式,分别从参数传递机制,拷贝机制,是否更改原值方面将问题拆分了8种以下情况,并用简单的代码示例来探究解释。

情况1:函数的形参是值类型,实参是值类型的处理情况

package mainimport "fmt"func modifyValue(val int) {val = 100
}func main() {x := 10modifyValue(x)fmt.Println(x) // Output: 10 (原始值未被修改)
}

  • 参数传递机制:当函数形参是值类型,实参也是值类型时,编译器在函数调用时,会复制实参的副本传递给函数,编译器会在栈上分配内存空间,将参数的值复制到栈上的内存位置,然后将栈的内存地址传递给函数
  • 是否修改原始值:不会修改原始值,因为修改只影响参数的副本

情况2:函数的形参是值类型,实参是指针类型的处理情况

package mainimport "fmt"func modifyValue(val int) {val = 100
}func main() {x := 10modifyValue(&x)fmt.Println(x) // cannot use &x (value of type *int) as int value in argument to modifyValue
}

函数的形参是值类型,传递给函数逇也必须是值类型,类型匹配原则 ,类型不匹配编译报错

情况3:函数的形参是指针类型,实参是值类型的处理情况

package mainimport "fmt"func modifyValue(val *int) {*val = 100
}func main() {x := 10modifyValue(x)fmt.Println(x) // cannot use x (variable of type int) as *int value in argument to modifyValue
}

 函数的形参是指针类型,传递给函数的也必须是指针类型,类型匹配原则 ,类型不匹配编译报错

情况4:函数的形参是指针类型,实参是指针类型的处理情况

package mainimport "fmt"func modifyValue(val *int) {*val = 100
}func main() {x := 10modifyValue(&x)fmt.Println(x) // output 100 更改原值
}
  • 参数传递机制:当函数形参是指针类型时,实参也是指针类型时,编译器在函数调用时,会复制实参的地址传递给函数,编译器会在栈上分配空间,将参数的地址复制到栈的内存位置,然后将栈的内存地址传递给函数
  • 是否修改原始值:通过指针可以间接地修改原始值

情况5:方法的接收者是值类型,方法的调用者是值类型的处理情况

package mainimport "fmt"type Myint intfunc (m Myint) modify() {m = 10
}func main() {x := Myint(5)x.modify()fmt.Println(x) //output 5
}
  • 参数传递机制:在栈上为调用者分配内存空间,调用方法时,会将调用者的值复制一份,传递给方法的接收者。
  • 是否修改原始值:不会修改原始值,因为修改的只是调用者的副本

情况6:方法的接收者是值类型,方法的调用者是指针类型的处理情况

package mainimport "fmt"type Myint intfunc (m Myint) modify() {m = 10
}func main() {x := Myint(5)(&x).modify()fmt.Println(x) //output 5
}
  • 参数传递机制:编译器会将调用者指针解引用为值,然后在解引用后的对象上调用方法,在栈上分配内存空间,并将指针解引用后的值复制到分配的内存位置。编译器将指针解引用,然后解引用后的对象上调用方法
  • 是否修改原始值:不会修改原始值,因为调用者是指针类型,接收者是值类型,调用者后的对象是调用者的副本。

情况7:方法的调用者是指针类型,方法的调用者是值类型的处理情况

package mainimport "fmt"type Myint intfunc (m *Myint) modify() {*m = 10
}func main() {x := Myint(5)x.modify()fmt.Println(x) //output 10
}
  • 参数传递机制:调用方法时,编译器会隐式地取调用者的地址,传递给方法的接收者
  • 是否修改原始值:调用地址的副本间接修改原始值

情况8:方法的调用者是指针类型,方法的调用者是指针的处理情况

package mainimport "fmt"type Myint intfunc (m *Myint) modify() {*m = 10
}func main() {x := Myint(5)(&x).modify()fmt.Println(x) //output 10
}
  • 参数传递机制:调用方法时,直接将调用者的地址传递给方法的接收者
  • 是否修改原始值:直接修改原始值

总结

        对于函数的形参和实参,参数的类型必须匹配。如果函数的形参是值类型,则传递给它的实参必须是值类型;如果形参是指针类型,则传递给它的实参必须是指针类型。

        而对于方法的接收者和调用者,Go 允许方法的接收者是值类型,这意味着可以直接使用值类型的实例调用该方法;也可以是指针类型,这意味着可以使用指针类型的实例调用该方法。

这种灵活性使得在设计和使用方法时更加方便,可以根据具体的需求和场景选择适合的方法接收者类型。

  • 对于函数(即不附属于任何类型的函数),如果函数的参数是指针类型,那么调用该函数时必须传递一个指针作为参数。这是因为函数是独立存在的,没有与之关联的接收者对象,因此无法通过隐式的方法接收者来自动解引用指针。
  • 对于方法(即附属于某个类型的函数),如果方法的接收者是指针类型,那么在调用该方法时,可以选择传递一个值类型的接收者或者一个指针类型的接收者。如果传递的是值类型的接收者,Go 语言会在内部将其自动解引用为指针类型。这是因为方法是与类型相关联的,可以通过类型的值或指针来调用方法,而不需要显式地进行解引用。

简而言之,函数需要显式地传递指针作为参数,而方法可以接受值类型或指针类型的接收者,并在需要时进行自动解引用。这就是“Methods and pointer indirection”的含义所在

http://www.dinnco.com/news/20936.html

相关文章:

  • 中国4a广告公司有哪些标题优化方法
  • 在百度做推广需要网站吗搜索引擎优化趋势
  • 网站开发的公司排名如何做百度搜索推广
  • 吴忠网页设计南昌seo排名收费
  • java做网站教程视频秦皇岛seo优化
  • 公众号里的网站怎么做的站长工具seo排名查询
  • 做零食的网站seo推广软件排行榜
  • 网站建设与管理期末小米口碑营销案例
  • 不会建网站如何找做网站的公司
  • 市场监督管理局局长锦州网站seo
  • html网站的直播怎么做杭州seo招聘
  • 在一家传媒公司做网站编辑_如何?电商平台有哪些
  • seo 网站案例搜索引擎营销的案例
  • 网站建设登录长沙有实力seo优化
  • 婚纱摄影网站html怎么在百度上添加自己的店铺地址
  • 专业网站建设组织百度seo排名技术必不可少
  • 做网站加盟app推广在哪里可以接单
  • 为什么做网站备案的人态度差怎么免费制作网页
  • 管理咨询师宁波网站推广优化哪家正规
  • 网站设置会员网站怎样优化seo
  • 网站多大需要服务器网络技术推广服务
  • 网站设计 macseo学途论坛网
  • 日本人做的摇滚网站有什么好的推广平台
  • 成都网站搜索排名优化哪家好企业网站建设方案策划书
  • 深圳网站建设费用大概多少百度指数指的是什么
  • 做网站需要什么技术员宁波网站制作优化服务
  • 关于集团网站建设的修改请示百度网站
  • 武汉seo人才济南网站优化排名推广
  • 大连金州代做网站公众号南昌关键词优化软件
  • 网站创建方案sem与seo的区别