指针
指针的概念
指针概念在Go语言中分为两个概念
- 类型指针,允许对这个指针类型的数据进行更改,传递数据使用指针,无需拷贝数据;和c/c++不同的是类型指针不能进行偏移和运算
- 切片,由指向起始元素的元素指针,元素数量和容量组成
- Go语言中的指针相较简单,只需要知道指针地址,指针类型,指针取值几个概念即可
指针地址与指针类型
每个变量在运行时都拥有一个内存地址,Go语言中使用”&”放在变量前,去取变量的内存地址。
- 示例:
package main import "fmt" func main() { str1:="I love Go" fmt.Printf("str1 内存地址: %p\n",&str1) } // 输出: $ go run "./tempCodeRunnerFile.go" str1 内存地址: 0xc000010060
获取指针指向的值
- 在变量使用“&”获取内存地址后,可以使用”*”获取指针地址/指针变量指向的值
- 示例:
package main import "fmt" func main() { str1:="I love Go" fmt.Printf("str1 内存地址: %p\n",&str1) fmt.Printf("str1 变量类型:%T\n",str1) fmt.Printf("str1 的值:%s\n",*&str1) } // 输出: $ go run "./tempCodeRunnerFile.go" str1 内存地址: 0xc000010200 str1 变量类型:string str1 的值:I love Go
使用指针修改值
- 示例:
package main import ( "fmt" ) func swap(a, b *int) { t := *a *a = *b *b = t } func main() { x, y := 1, 2 swap(&x, &y) fmt.Printf("X:%d,Y:%d\n", x, y) } // 输出: $ go run "./指针修改值.go" X:2,Y:1
创建指针的另一种方法
- 格式:
new(Type)
- 示例:
package main import ( "fmt" ) func main() { a := new(int) *a = 100 fmt.Println(a, *a) } 输出: $ go run "./指针创建new.go" 0xc0000aa000 100
常量
相对于变量,常量就是恒定不变的量,例如圆周率,一周几天;常量的声明和变量的声明非常类似,只是把var换成const
const pi = 3.1415926 const ( name = "lisong" sex = "man" )
常量的枚举
Go语言的枚举是要常量配合iota模拟,常量的作用:如果在编码过程中如果常量的值特别多,很容易重复或者写错,使用iota自动生成就很方便了
package main import "fmt" const ( num1 = 1 << iota num2 num3 num4 ) const ( num11 = 1 + iota num12 num13 num14 ) func main() { fmt.Println(num1, num2, num3, num4) fmt.Println(num11, num12, num13, num14) } // 输出: $ go run "./常量的枚举.go" 1 2 4 8 1 2 3 4
将枚举值转换成字符串
- 使用String()方法的Week在使用上和普通常量上没有区别,当这个类型需要显示为字符串时,Go语言会自动找String()方法并进行调用
package main import "fmt" type Week int const ( Sunday Week = iota Monday Tuesday Wednesday Thursday Friday Saturday ) func (w Week) String() string { // 必须定义方法名字为String()的方法 switch w { case Sunday: return "Sunday" case Monday: return "Monday" case Tuesday: return "Tuesday" case Wednesday: return "Wednesday" case Thursday: return "Thursday" case Friday: return "Friday" case Saturday: return "Saturday" default: return "None" } } func main() { fmt.Printf("iota:%d\nstring:%s\n", Monday, Monday) } //输出: $ go run "./枚举值转换字符串.go" iota:1 string:Monday
类型别名
类型别名与类型定义
- 定义区别
type newInt int // 类型定义 type aliasInt = int // 类型别名
- 示例:
package main import "fmt" type newInt int type aliasInt = int func main() { var ( a newInt b aliasInt ) fmt.Printf("a的类型:%T\nb的类型:%T\n", a, b) } //输出: go run "./类型别名类型定义区别.go" a的类型:main.newInt b的类型:int
非本地类型不能定义方法
- 一般类型别名不能定义方法,类型定义可以定义方法,类型别名如果想要定义方法,类型别名定义必须定义在原类型所在的包中