哪些类型可以作为常量类型
只有基本数据类型才可以作为常量类型,像int、float、bool、string,complex,rune 而引用类型,实例化对象是不可以的( 结构体、接口、哈希、切片)。
数组类型和切片类型、引用和数值类型
值类型在赋值和传参的时候,传递的是值的拷贝。 引用类在赋值和传参的时候,传递的是地址的拷贝。
值类型的内存分配在栈中,引用类型的内存通常分配在堆中。 栈内存由系统直接管理,(系统会自己回收)。堆内存需要自己管理(在Golang中有自己的垃圾回收器)。
- 数组是值类型
- 切片、map、管道、接口(特别记住函数也是)引用类型
判断类型: 可以用nil赋值的是引用类型,不可以用nil赋值的是数值类型。
/*值类型
*/
type Person struct {}
var i int = nil
var j float64 = nil
var b bool = nil
var k string = nil
var a [3]int = nil
var p Person = nil
/*
引用类型,可以使用nil进行赋值
*/
var i1 *int = nil
var j1 map[string]int = nil
var k1 interface{} = nil
var m1 chan int = nil
var f func(int) = nil
使用nil进行赋值的时候必须指定变量的类型。
关于自增型
只有i++,并且只能单独执行
关于类型方法的主语参数问题
首先给Integer定义俩个方法:
type Integer int
func (i *Integer) Add(b Integer) Integer {
return *i + b
}
func (i Integer) Mul(b Integer) Integer {
return i * b
}
使用值类型调用指针方法:
var i Integer = 3
println(i.Add(4))
println(i.Mul(5))
使用指针类型调用值方法:
var index Integer = 4
var p *Integer = &index
println(p.Add(3))
println(p.Mul(3))
如果使用接口直接断言的情况下,值类型是不能调用引用方法,引用方法不能调用值类型。
var t interface{} = index
//fmt.Println(t.(Integer).Add(3)) // 这个是不行的
middle := t.(Integer)
println(middle.Add(3)) // 这个却是可以的
接口方法
- 如果需要改变结构体实例中的变量,需要使用指针做方法主语。
type NameGetter interface {
SetName(name string)
}
type Person struct {
name string
}
func (p Person) SetName(name string) {
p.name = name
}
这个时候通过SetName去修改的变量是无效的。
- 指针类型实现的接口,给接口赋值时必须使用到指针。
type NameGetter interface {
SetName(name string)
}
type Person struct {
name string
}
func (p *Person) SetName(name string) {
p.name = name
}
func main() {
var nameIntrface NameGetter = Person{} // 错误!!!!!
var nameIntrface NameGetter = &Person{} // 这个是正确的!!!!
}