go基础知识-指针/结构体/方法/接口/函数

1.指针:&(取地址)和*(根据地址取值),空指针,可以使用new初始化指针

 定义:ptr := &v // v的类型为T

指针声明:var ptr *T  指针作为引用类型需要初始化后才会拥有内存空间,才可以给它赋值

初始化:     ptr = new(T)

   //案例

var a int = 10
fmt.Printf("a变量空间地址%v",&a)//a变量空间地址0xc00000a0b8
fmt.Println()
var b *int = &a
fmt.Printf("b本身的值%v,b空间的地址%v",b,&b)//b本身的值0xc00000a0b8,b空间的地址0xc000006030

//空指针
var c *string
fmt.Println(c)

//初始化指针,new函数得到的是一个类型的指针,并且该指针对应的值为该类型的零值
var d = new(int)
fmt.Println(*d)//0


2.结构体

   a.自定义类型/类型别名

   b.结构体

//自定义类型
type myType int
//类型别名
type myAlisType = int
//结构体定义
type Student struct {

}
//案例

func main(){
var a myType
var b myAlisType
//区别看输出结果
fmt.Printf("type of a:%T\n", a) //type of a:main.myType
fmt.Printf("type of b:%T\n", b) //type of b:int
}


3.方法:可以类比和C#里的this扩展方法,注意指针和普通在方法内对数据操作的影响
只能为当前包内命名类型定义方法。
• 参数 receiver 可任意命名。如方法中未曾使用 ,可省略参数名。
• 参数 receiver 类型可以是 T 或 *T。基类型 T 不能是接口或指针。 
• 不支持方法重载,receiver 只是参数签名的组成部分。
• 可用实例 value 或 pointer 调用全部方法,编译器自动转换。

案例:
type Student struct {

}

func (p *Student) Method1(){
fmt.Println("point objetct method")
}

func (p Student) Method2(){
fmt.Println("normal method")
}

func main(){
var stu = Student{}//&Student{}
stu.Method1()
stu.Method2()
}


4.接口:注意值接收者和指针接收者的区别,并且如果实现的某个方法仅仅是指针接收者,则对象需要定义成指针类型,否则会报错
定义:type 接口名 interface{ 空方法.... }

案例:
type People interface {
Speak(string) string
}

type Student2 struct{}

func (stu *Student2) Speak(think string) (talk string) {
if think == "sb1" {
talk = "你是"
} else {
talk = "talk"
}
return
}

func main(){
var peo People = &Student2{} //错误方式 Student2{}
think := "bitch"
fmt.Println(peo.Speak(think))//talk
}


5.函数:和其他语言的函数没啥区别,就注意下多参数传参使用情况
比如: func f1(parms ...interface{}){
//如果有些需要对传入的params应用到某些具体方法或者函数里,需要 ...params
}
 
 



 

posted @ 2022-03-04 17:54  说好的你  阅读(187)  评论(0)    收藏  举报