概述
今天的知识点相对零散,以日记形式记录。
1. 结构体实例
- 首先,结构体是值类型,非引用类型;因此var 后 会分配内存。
- 注意下面三种写法的区别
package main
import "fmt"
type Person struct {
Name string
}
func main() {
var p1 = new(Person) // 结构体实例 - 指针
var p2 = Person{} // 结构体实例(老老实实写法)
var p3 Person // 结构体实例 (值类型自动初始化了)
fmt.Printf("p1: %#v Type: %T\n", p1, p1)
fmt.Printf("p2: %#v Type: %T\n", p2, p2)
fmt.Printf("p3: %#v Type: %T\n", p3, p3)
}
// p1: &main.Person{Name:""} Type: *main.Person
// p2: main.Person{Name:""} Type: main.Person
// p3: main.Person{Name:""} Type: main.Person
2. 接口方法 + 指针接收者
- 在结构体中我们知道,无论是机构体指针还是实例它们都能同时驱动,实例接收者、指针接收者;
- 对于指针接收者而言,则不行,必须要老老实实用指针。
package main
import "fmt"
type Speaker interface {
say()
}
type Person struct {
Name string
}
func (p *Person) say() {
fmt.Println("hello")
}
func main() {
p1 := Person{Name: "zhangsan"} // Person实例
var p2 Speaker = Person{Name: "wangwu"} // Speaker 接口
// 由于say方法的接收者是指针,而这里是实例所以会报错
// cannot use Person{…} (value of type Person) as Speaker value in variable declaration: Person does not implement Speaker (method say has pointer receiver)
// 正确写法这里改成指针
p1.say()
p2.say()
}
3. 看代码时遇到接口类型咋办?
- 只关注输入和输出,不关注具体实现(我们去看接口中方法的就行)
- 如果要知道当前这个接口具体指的是哪个对象
-
fmt.Printf("%#v")
打印出来看 - 可以用
dlv
调试追踪看看(需要特别说明的时,dlv调试的时候,会看到当前接口,在接口往下有一个data:在data里能看到真实的对象是哪个)
4. 看golang文档的心得
- type 相当于类
-
下面有函数-类方法;方法- 实例方法
image.png
5. int类型是什么类型?
它的位数取决于你的操作系统,如果是32位则是32位;如果是64位则是64位
package main
import "fmt"
func main() {
a := int(99999990999999)
fmt.Printf("T: %T; %#v\n", a, a)
}
// T: int; 99999990999999
网友评论