指针
- 空指针直接声明,就有nil值
- 与c++一样,new声明
- *+类型的方式
-
注意:Go中只有值传递,指针传参传的是值
- go 可以通过
unsafe.Pointer来把指针转换为uintptr类型的数字,来实现指针运算。这里请注意,uintptr是一种整数类型,而不是指针类型。- 对语句
for _, v := range input { ch <- &v }- 在
for range语句中,v变量用于保存迭代input数组所得的值,但是v只被声明了一次,此后都是将迭代input出的值赋值给v,v变量的内存地址始终未变,这样再将v的地址发送给ch通道,发送的都是同一个地址。 - 改进:
- 引入一个中间变量,使得每次temp有个新声明:
for _, v := range input { temp := v ch <- &temp } - 直接引用数据的内存(无需开辟新的内存空间):
for k, _ := range input { c <- &input[k] } -
当然,尽可能别用这样的方式(将指针与for range结合)
- 引入一个中间变量,使得每次temp有个新声明:
- 在
- 对语句
结构体
-
go中无class
-
属性定义在结构体里
type 名 struct{}-
func (person Profile) FmtProfile() {}- 其中
fmt_profile是方法名,而(person Profile):表示将 fmt_profile 方法与 Profile 的实例绑定。 - Profile 称为方法的接收者,而 person 表示实例本身,相当于 Python 中的 self,在方法内可以使用
person.属性名的方法来访问实例属性。
- 其中
-
实例化
- 如
myself := Profile{name: "小明", age: 24, gender: "male"}
- 如
-
指针相关
- 定义方法的方式
- 当你想要在方法内改变实例的属性的时候,必须使用指针做为方法的接收者
func (person *Profile) increase_age() { person.age += 1 }
- 使用指针的场景
- 需要在方法内部改变结构体内容的时候
- 出于性能的问题,当结构体过大的时候
- 定义方法的方式
-
-
结构体实现 “继承”
- go语言本身不存在继承
- 它使用组合的方法,实现类似继承的效果
- 方式:
- 例子:将 company 这个 结构体嵌入到 staff 中,做为 staff 的一个匿名字段,staff 就直接拥有了 company 的所有属性了
-
type staff struct { name string company // 匿名字段 } - 然后在实例化staff之前,先实例化company,再作为一个对象value赋值用于实例化staff
首字母大小写
- Go语言对首字母有自己的规则
- 它被来实现控制对方法的访问权限。
- 当方法的首字母为大写时,这个方法对于所有包都是Public,其他包可以随意调用
- 当方法的首字母为小写时,这个方法是Private,其他包是无法访问的。
- 它被来实现控制对方法的访问权限。
思考学习
- 跟c++还是有很多区别的,要更加熟悉语法才行
- 做做项目练练手才是王道