...menustart
...menuend
type Queue struct {
elements []interface{}
}
func NewQueue() *Queue {
return &Queue{make([]interface{}, 10)}
}
func (*Queue) Push(e interface{}) error {
panic("not implemented")
}
func (self0 *Queue) length() int {
return len(self0.elements)
}
type Data struct{
x int
}
func (self Data) ValueTest() {
fmt.Printf("Value: %p\n", &self)
}
func (self *Data) PointerTest() {
fmt.Printf("Pointer: %p\n", self)
}
func main() {
d := Data{}
p := &d
fmt.Printf("Data: %p\n", p) // 0x2101ef018
d.ValueTest() // ValueTest(d) 0x2101ef028
d.PointerTest() // PointerTest(&d) 0x2101ef018
p.ValueTest() // ValueTest(*p) 0x2101ef030
p.PointerTest() // PointerTest(p) 0x2101ef018
}
PS: 因为是值类型,所以 valueTest 每次的地址都不一样
type User struct {
id int
name string
}
type Manager struct {
User
title string
}
func (self *User) ToString() string {
return fmt.Sprintf("User: %p, %v", self, self)
}
func (self *Manager) ToString() string {
return fmt.Sprintf("Manager: %p, %v", self, self)
}
func main() {
m := Manager{User{1, "Tom"}, "Administrator"}
fmt.Println(m.ToString())
fmt.Println(m.User.ToString())
}
输出:
Manager: 0x2102271b0, &{{1 Tom} Administrator}
User : 0x2102271b0, &{1 Tom}
方法分为两种表现形式
instance.method(args...) //方法 value
<type>.func(instance, args...) //方法表达式
package main
import "fmt"
type User struct {
id int
name string
}
func (self User) Test() {
fmt.Println(self)
}
func main() {
u := User{1, "Tom"}
mValue := u.Test //receiver会被立即复制
u.id, u.name = 2, "Jack"
u.Test() // 方法value调用
mValue() // 这个还是方法value调用
User.Test( u ) // 方法表达式调用
}
输出:
{2 Jack}
{1 Tom}
{2 Jack}
FuncVal { method_address, receiver_copy }
type Data struct{}
func (Data) TestValue() {}
func (*Data) TestPointer() {}
func main() {
var p *Data = nil
p.TestPointer()
(*Data)(nil).TestPointer() // method value
(*Data).TestPointer(nil) // method expression
// p.TestValue() //空指针
// Data.TestValue(nil) // nil不能转为Data
// Data.TestPointer() //T方法集里没有receiver *T方法
}
所谓对应方法,是指 方法名,参数类型,返回值类型 都相同。
type Stringer interface {
String() string
}
type Printer interface {
Stringer // 借口嵌入
Print()
}
func (self *User) String() string {
return fmt.Sprintf("user %d, %s", self.id, self.name)
}
func (self *User) Print() {
fmt.Println(self.String())
}
func main() {
var t Printer = &User{1, "Tom"} // *User 实现了 Printer接口
t.Print() // user 1, Tom
}
interface{} 作用类似其他语言中的根对象 object
func Print(v interface{}) {
fmt.Printf("%T: %v\n", v, v)
}
func main() {
Print(1) // int: 1
Print("Hello, World!") // string: Hello, World!
}
type Tester struct {
s interface {
String() string
}
}
struct Iface
{
Itab* tab;
void* data;
};
type User struct {
id int
name string
}
func main() {
u := User{1, "Tom"}
var i interface{} = u // 复制 结构体
u.id = 2
u.name = "Jack"
fmt.Printf("%v\n", u) // {2 Jack}
fmt.Printf("%v\n", i.(User)) // {1 Tom}
}
type User struct {
id int
name string
}
func main() {
u := User{1, "Tom"}
var vi, pi interface{} = u, &u
// vi.(User).name = "Jack" // cannot assign to vi.(User).name
pi.(*User).name = "Jack"
fmt.Printf("%v\n", vi.(User)) // {1 Tom}
fmt.Printf("%v\n", pi.(*User)) // &{1 Jack}
}
var a interface{} = nil // tab = nil, data = nil
var b interface{} = (*int)(nil) // tab 包含 *int 类型信息, data = nil
type User struct {
id int
name string
}
func (self *User) String() string {
return fmt.Sprintf("%d, %s", self.id, self.name)
}
func main() {
var o interface{} = &User{1, "Tom"}
if i, ok := o.(fmt.Stringer); ok { // ok-idiom
fmt.Println(i) // 1, Tom
}
u := o.(*User)
// u := o.(User) // panic: *main.User, not main.User
fmt.Println(u) // 1, Tome
}
func main() {
var o interface{} = &User{1, "Tom"}
switch v := o.(type) {
case nil: // o == nil
fmt.Println("nil")
case fmt.Stringer: // interface
fmt.Println(v)
case func() string: // func
fmt.Println(v())
case *User: // *struct
fmt.Printf("%d, %s\n", v.id, v.name)
default:
fmt.Println("unknown")
}
}
// 确保 *Data 实现 fmt.Stringer 接口
var _ fmt.Stringer = (*Data)(nil)
type Tester interface { // Tester接口,需要实现 Do()方法
Do()
}
type FuncDo func() // 定义一个方法类型 FuncDo
func (self FuncDo) Do() { self() } // FuncDo 实现了 Tester 接口
func main() {
// 匿名方法转为 FuncDo 类型,再赋值给 Tester接口对象
var t Tester = FuncDo(func() { println("Hello, World!") })
t.Do()
}