【第七篇】Golang 从菜鸟到大咖的必经之路_Go语言指针与标识符

100 阅读5分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第1篇文章,点击查看活动详情

一、指针:

一、基本介绍:

  1. 基本数据类型,变量存在就是值,也就是值类型。
  2. 获取变量的地址,用&,比如:var num int,获取num的地址:&num分析一下基本数据类型在内存的布局。

  1. 指针类型,指针变量存的是一个地址,这个地址指向的空间存的才是值,比如:var ptr * int = &num
  • * int:代表一个存放指针的变量,他是一个变量。
  • ptr :本身也存在地址。
  • 指针的简单理解:值类型回家找妈妈,指针类型:爸,我妈呢?
  • 举例说明:指针在内存的布局。

\

  1. 获取指针类型所指向的值,使用: ,比如: var ptr * int,使用*ptr 获取ptr指向的值。
package main

import (
	"fmt"
)

// 演示golang中指针类型:
func main() {

	// 基本数据类型在内存布局
	var i int = 10
	// i 的地址是什么,&i
	fmt.Println("i 的地址=", &i)
	// ==> i 的地址= 0xc000014088

	var ptr *int = &i
	// 1. ptr 是一个指针变量
	// 2. ptr 的类型 *int
	// 3. ptr 本身的值&i
	fmt.Printf("ptr=%v\n", ptr)
	fmt.Printf("ptr 的地址=%v\n", &ptr)
	fmt.Printf("ptr 指向的值=%v", *ptr)
	// & 取地址、*取值

}

  1. 案例再说明:


二、案例演示:

  1. 写一个程序,获取一个int变量num地址,并显示到终端。
package main

import (
	"fmt"
)

// 演示golang中指针类型:
func main() {

	// 基本数据类型在内存布局
	var i int = 10
	// i 的地址是什么,&i
	fmt.Println(" i 的地址=", &i)
	// ==> i 的地址= 0xc000014088
}


  1. num的地址赋给指针ptr,并通过ptr去修改num的值。

package main

import "fmt"

func main() {
	var num int = 9 // 3. 此时 num 空间中存贮的值为 9
	fmt.Printf("num address=%v\n", &num)

	var ptr *int
	ptr = &num // 1. ptr  ==> 指向的是 num 的地址
	*ptr = 10  // 2. ptr  ==> 访问的就是这个num的空间(9)
	// 4. 这里修改时,会导致 num 的值变化
	fmt.Println("num = ", num)

}


三、指针的课堂练习:

1. * 是指针变量,只存储地址   * 要跟 &联动
2. 变量类型不一定,不能进行指针操作

四、指针的使用细节:

  1. 值类型,都有对应的指针类型,形式为 * 数据类型,比如 int的对应的指针就是 * int,float32对应的指针类型就是 *float32 ,以此类推。
  2. 值类型包括:基本数据类型 int 系列、float 系列、bool 、string 、数组和结构体 struct

二、值类型和引用类型:

一、值类型和引用类型的说明:

  1. 值类型:基本数据类型 int 系列、float 系列、bool 、string 、数组和结构体 struct
  2. 引用类型:指针、slice 切片、map、管道chan、interface 等都是引用类型
  3. 简单来说:值类型操作是镜像、引用类型操作的是真实的数据。

二、值类型和引用类型的使用特点:

  1. 值类型:变量直接存储值,内存通常在栈中分配
  • 示意图:

  1. 引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据(值),内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由GC来回收。
  • 示意图:

  1. 内存的栈区和堆区示意图:


三、标识符的命名规范:

一、标识符概念:

  1. Golang 对各种变量、方法、函数等命名时使用的字符序列称为标识符。
  2. 凡是自己可以起名字的地方叫标识符。

二、标识符的命名规则:

  1. 由26个英文字母大小写,0-9,_ 组成。
  2. 数字不可以开头。
  • var num int // ok
  • var 3num int // error
  1. Golang 中严格区分大小写
  • var num int
  • var Num int
  • 说明:在 golang 中,num 和 Num 是两个不同的变量。
package main

import "fmt"

func main() {
	// golang 中严格区分大小写
	// Golang 中认为 num 和 Num 是不同的变量
	var num int = 10
	var Num int = 20
	fmt.Printf("num=%v	Num=%v\n", num, Num)
}

  1. 标识符不能包含空格。

  1. 下划线“_”本身在Go中是一个特殊的标识符,称为空标识符。可以代表任何其它的标识符,但是它对应的值会被忽略(比如:忽略某个返回值)。 所以仅能被作为占位符使用,不能作为标识符使用。

  1. 不能以系统保留关键字作为标识符(一共有25个),比如 break ,if 等等.......

三、标识符的案例:

hello //ok
hello12 //ok
1hello  //error 、不能以数字开头
h-b //error ,不能使用-
x h //error ,不能含有空格
h_4 //ok
_ab //ok
int //ok ,我们要求大家不要这样使用
float32 // ok ,我们要求大家不要这样使用
_ //error
Abc  //ok
package main

import "fmt"

func main() {
	// golang 中严格区分大小写
	// Golang 中认为 num 和 Num 是不同的变量
	var num int = 10
	var Num int = 20
	fmt.Printf("num=%v	Num=%v\n", num, Num)

	// 标识符中不能含有空格
	// var ab c int = 30

	// _ 是空标识符,用于占用
	// var _ int = 40 //error
	// fmt.Println(_)

	// 找到了一个让别人看不懂代码的方法了,手动狗头
	var int int = 90
	fmt.Println(int)
}


四、标识符命名注意事项:

  1. 包名:保持 package XXXX 的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,不要和标准库不要冲突 fmt
  2. 变量名、函数名、常量名:采用驼峰法
  • 举例:
  • var stuName string = "tom"
  • 形式:xxxYyyyyZzzzz......
  • var goodPrice float32 = 1234.5
  1. 如果变量名、函数名、常量名首字母大写,则可以被其他的包访问:如果首字母小写,则只能在本包中使用(注:可以简单的理解成,首字母大写是公开的,首字母小写是私有的),在Golang 没有public,private 等关键字。

四、系统保留关键字:

一、保留关键字介绍:

  • 在Go中,为了简化编译过程中对代码的解析,其定义的保留关键字只有25个。


五、系统的预定义标识符:

一、预定义标识符介绍:

除了保留关键字外,Go还提供了36个预定的标识符,其包括基础数据类型和系统内嵌函数