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

网站搭建上门多少钱电脑网络连接不上怎么解决

网站搭建上门多少钱,电脑网络连接不上怎么解决,网站设计稿一般尺寸,平面设计师兼职网站指针在编程中,一个内存地址用来定位一段内存。通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32位操作系统上的理…

指针

在编程中,一个内存地址用来定位一段内存。

通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32位操作系统上的理论最大支持内存容量为4GB(1GB == 230字节),64位操作系统上的理论最大支持内存容量为264Byte,即16EB(EB:艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。

内存地址的字面形式常用整数的十六进制字面量来表示,比如0x1234CDEF。

在Go中,一个无名指针类型的字面形式为*T,其中T为一个任意类型。类型T称为指针类型*T的基类型(base type)。 如果一个指针类型的基类型为T,则我们可以称此指针类型为一个T指针类型。

虽然我们可以声明具名指针类型,但是一般不推荐这么做,因为无名指针类型的可读性更高。

如果一个指针类型的底层类型是*T,则它的基类型为T。

如果两个无名指针类型的基类型为同一类型,则这两个无名指针类型亦为同一类型。

*int  // 一个基类型为int的无名指针类型。
**int // 一个多级无名指针类型,它的基类型为*int。type Ptr *int // Ptr是一个具名指针类型,它的基类型为int。
type PP *Ptr  // PP是一个具名多级指针类型,它的基类型为Ptr。

如何获取一个指针值?

有两种方式来得到一个指针值:

  1. 我们可以用内置函数new来为任何类型的值开辟一块内存并将此内存块的起始地址做为此值的地址返回。 假设T是任一类型,则函数调用new(T)返回一个类型为*T的指针值。 存储在返回指针值所表示的地址处的值(可被看作是一个匿名变量)为T的零值。

  1. 我们也可以使用前置取地址操作符&来获取一个可寻址的值的地址。 对于一个类型为T的可寻址的值t,我们可以用&t来取得它的地址。&t的类型为*T。

一般说来,一个可寻址的值是指被放置在内存中某固定位置处的一个值(但放置在某固定位置处的一个值并非一定是可寻址的)。 目前,我们只需知道所有变量都是可以寻址的;但是所有常量、函数返回值和强制转换结果都是不可寻址的。 当一个变量被声明的时候,Go运行时将为此变量开辟一段内存。此内存的起始地址即为此变量的地址。

对于基类型为T的指针类型的一个指针值p,我们可以用*p来表示地址p处的值。 此值的类型为T。*p称为指针p的解引用。解引用是取地址的逆过程。

解引用一个nil指针将产生一个panic。

package mainimport "fmt"func main() {p0 := new(int)   // p0指向一个int类型的零值fmt.Println(p0)  // (打印出一个十六进制形式的地址)fmt.Println(*p0) // 0x := *p0              // x是p0所引用的值的一个复制。p1, p2 := &x, &x      // p1和p2中都存储着x的地址。// x、*p1和*p2表示着同一个int值。fmt.Println(p1 == p2) // truefmt.Println(p0 == p1) // falsep3 := &*p0            // <=> p3 := &(*p0)// <=> p3 := p0// p3和p0中存储的地址是一样的。fmt.Println(p0 == p3) // true*p0, *p1 = 123, 789fmt.Println(*p2, x, *p3) // 789 789 123fmt.Printf("%T, %T \n", *p0, x) // int, intfmt.Printf("%T, %T \n", p0, p1) // *int, *int
}

在Go中,所有的赋值(包括函数调用传参)过程都是一个值复制过程。 所以在上面的double函数体内修改的是变量a的一个副本,而没有修改变量a本身。

当然我们可以让double函数返回输入参数的两倍数,但是此方法并非适用于所有场合。

package mainimport "fmt"func double(x *int) {*x += *xx = nil // 此行仅为讲解目的
}func main() {var a = 3double(&a)fmt.Println(a) // 6p := &adouble(p)fmt.Println(a, p == nil) // 12 false
}

通过将double函数的输入参数的类型改为*int,传入的实参&a和它在此函数体内的一个副本x都引用着变量a。 所以对*x的修改等价于对*p(也就是变量a)的修改。 换句话说,新版本的double函数内的操作可以反映到此函数外了。

当然,在此函数体内对传入的指针实参的修改x = nil依旧不能反映到函数外,因为此修改发生在此指针的一个副本上。 所以在double函数调用之后,局部变量p的值并没有被修改为nil。

在Go中返回一个局部变量的地址是安全的

Go是支持垃圾回收的,所以一个函数返回其内声明的局部变量的地址是绝对安全的。

func newInt() *int {a := 3return &a
}

Go指针的一些限制

施加限制,Go指针保留了C指针的好处,同时也避免了C指针的危险性。

  • 在Go中,指针是不能参与算术运算的。比如,对于一个指针p, 运算p++和p-2都是非法的。

  • 如果p为一个指向一个数值类型值的指针,*p++将被编译器认为是合法的并且等价于(*p)++。 换句话说,解引用操作符*的优先级都高于自增++和自减--操作符。

  • 一个指针值不能和其它任一指针类型的值进行比较

Go指针值是支持(使用比较运算符==和!=)比较的。 但是,两个指针只有在下列任一条件被满足的时候才可以比较:
这两个指针的类型相同。
其中一个指针可以被隐式转换为另一个指针的类型。换句话说,这两个指针的类型的底层类型必须一致并且至少其中一个指针类型为无名的(考虑结构体字段的标签)。
其中一个并且只有一个指针用类型不确定的nil标识符表示。
  • 一个指针类型的值不能被随意转换为另一个指针类型

在Go中,只有如下某个条件被满足的情况下,一个类型为T1的指针值才能被显式转换为另一个指针类型T2:
类型T1和T2的底层类型必须一致(忽略结构体字段的标签)。 特别地,如果类型T1和T2中只要有一个是无名类型并且它们的底层类型一致(考虑结构体字段的标签),则此转换可以是隐式的。
类型T1和T2都为无名类型并且它们的基类型的底层类型一致(忽略结构体字段的标签)。

Go指针的限制是可以被打破的

unsafe标准库包中提供的非类型安全指针(unsafe.Pointer)机制可以被用来打破上述Go指针的安全限制。 unsafe.Pointer类型类似于C语言中的void*。 但是,通常地,非类型安全指针机制不推荐在Go日常编程中使用。

http://www.yayakq.cn/news/90102/

相关文章:

  • 青岛网站设计哪家群晖wordpress安装主题下载失败
  • drupal网站建设手机网站开发库
  • 网站添加flv视频代码网站毕业设计怎么做
  • 东莞专业网站推广怎么做学校网站开发价格
  • 网站开发ios郑州建网站需要多少钱
  • 根路径 网站昆明网站开发培训
  • 怎么添加网站权重桂林做网站
  • 佛山高明网站建设设计室内设计3d效果图
  • 下载模板后怎么建设网站wordpress伪静态 插件
  • jsp做的网站可以用的公关公司是干嘛的
  • 怎样在百度做网站打广告表格做网站
  • 专业制作网站电脑南京seo优化培训
  • 个人 网站建设方案书 备案我们网站在那里登陆后台系统管理
  • 网站建设的原则和目标西安注册公司地址可以是住宅吗
  • excel做的最好的网站免费做logo设计的网站
  • 微网站建设服务商品牌推广策划公司怎么选
  • 杭州论坛网站制作怎么制作学校网站
  • 中山网站建设招聘设置wordpress静态主页
  • 过年做哪个网站致富网站建设与管理实训报告总结
  • 沧州机械类网站建设策划行业网站
  • 哈尔滨网站域名备案做电影网站什么后果
  • tag 网站备案漳浦建设局网站
  • 有什么好的网站做推广的建行手机银行下载app最新版
  • 海东市城市规划建设局网站网站建设能干什么
  • 成都市做网站的公司elegant wordpress
  • 浙江网站网站建设方案范文1000字
  • 交易网站备案哈尔滨企业建网站推广
  • 短视频网站平台怎么做的如何判断一个网站是php还是asp
  • 万远翔网站建设常州建设局网站
  • 厦门有做网站建设通州个人做网站