
1.匿名组合
package main
import "fmt"
type XX string
type Person struct {
name string
sex bool
age int
}
type Student struct {
Person
id int
address string
name string
XX
eat *string
}
func main() {
s := Student{Person{"LGL", true, 20}, 001, "JX", "Tom", "XX", &"eat"}
fmt.Println(s)
fmt.Println(s.name)
s.name = "Test"
fmt.Println(s)
s.Person.name = "XXX"
fmt.Println(s)
}
2.方法
- 要注意方法和函数是不一样的
- 面向对象和面向过程的方法区别
package main
import "fmt"
func Add1(a, b int) int {
return a + b
}
type MyNum int
func (tmp MyNum) Add2(other MyNum) MyNum {
return tmp + other
}
func main() {
fmt.Println(Add1(1, 2))
var a MyNum = 2
fmt.Println(a.Add2(3))
}
- 结构体类型添加方法
- 接收的类型不同,同名也没关系,类似重载
package main
import "fmt"
type Student struct {
name string
sex bool
age int
}
func (tmp Student) Print() {
fmt.Println(tmp)
}
func (p *Student) Op(name string, sex bool, age int) {
p.name = name
p.sex = sex
p.age = age
}
func main() {
s := Student{"LGL", true, 18}
s.Print()
var p Student
(&p).Op("ZS", false, 19)
p.Print()
}
- 这里也要注意一下引用传递和值传递的方法,和之前一样
package main
import "fmt"
type Student struct {
name string
sex bool
age int
}
func (temp Student) PrintInfo() {
fmt.Println(temp)
}
func (temp Student) setInfoValues(n string, s bool, a int) {
temp.name = n
temp.sex = s
temp.age = a
fmt.Println("setInfoValues = ", temp)
}
func (temp *Student) setInfoPointer(n string, s bool, a int) {
temp.name = n
temp.sex = s
temp.age = a
fmt.Println("setInfoPointer = ", temp)
}
func main() {
s1 := Student{"A", true, 20}
fmt.Println("1 = ", s1)
s1.setInfoValues("B", false, 21)
fmt.Println("2 = ", s1)
s1.setInfoPointer("C", true, 22)
fmt.Println("3 = ", s1)
}
package main
import "fmt"
type Student struct {
name string
sex bool
age int
}
func (temp Student) SetInfoValues() {
fmt.Println("SetInfoValues")
}
func (temp *Student) SetInfoPointer() {
fmt.Println("SetInfoPointer")
}
func main() {
p := &Student{"Tom", false, 12}
p.SetInfoPointer()
p.SetInfoValues()
}
package main
import "fmt"
type Person struct {
name string
sex bool
age int
}
func (temp *Person) PrintInfo() {
fmt.Println(temp)
}
type Student struct {
Person
id int
address string
}
func main() {
p := Student{Person{"A", true, 20}, 001, "jx"}
p.PrintInfo()
}
package main
import "fmt"
type Person struct {
name string
sex bool
age int
}
func (temp *Person) PrintInfo() {
fmt.Println(temp)
}
type Student struct {
Person
id int
address string
}
func (temp *Student) PrintInfo() {
fmt.Println(temp)
}
func main() {
p := Student{Person{"A", true, 20}, 001, "jx"}
p.PrintInfo()
p.Person.PrintInfo()
}
- 方法值:给方法调用赋值一个变量 p := Person.Println()
- 方法表达式: 给方法名赋值一个变量 p:= Person.Println p(xxx)
3.接口

package main
import "fmt"
type Personer interface {
Eat()
}
type Student struct {
name string
id int
}
func (temp *Student) Eat() {
fmt.Println("Eat", temp)
}
type TT struct {
name string
id int
}
func (temp *TT) Eat() {
fmt.Println("TT", temp)
}
func Who(p Personer) {
p.Eat()
}
func main() {
s := &Student{"LGL", 1}
t := &TT{"TT", 1}
Who(s)
Who(t)
x := make([]Personer, 2)
x[0] = s
x[1] = t
for _, i := range x {
fmt.Println("i:", i)
}
}
package main
import "fmt"
type Iner1 interface {
Eat()
}
type Iner2 interface {
Iner1
Sleep()
}
type Student struct {
name string
id int
}
func (temp *Student) Eat() {
fmt.Println("Eat")
}
func (temp *Student) Sleep() {
fmt.Println("Sleep")
}
func main() {
var i Iner2
s := &Student{"LGL", 0}
i = s
i.Eat()
i.Sleep()
}
package main
import "fmt"
type Iner1 interface {
Eat()
}
type Iner2 interface {
Iner1
Sleep()
}
type Student struct {
name string
id int
}
func (temp *Student) Eat() {
fmt.Println("Eat")
}
func (temp *Student) Sleep() {
fmt.Println("Sleep")
}
func main() {
var i1 Iner1
var i2 Iner2
i1 = i2
i2 = i1
fmt.Println(i1)
fmt.Println(i2)
}
func main() {
var i interface{} = 1
fmt.Println(i)
i = "Hello World"
fmt.Println(i)
}
package main
import "fmt"
type Student struct {
name string
id int
}
func main() {
i := make([]interface{}, 3)
i[0] = 1
i[1] = "H"
i[2] = Student{"lgl", 123}
for index, data := range i {
if value, ok := data.(int); ok == true {
fmt.Println("index = ", index, "为int类型,值为:", value)
} else if value, ok := data.(string); ok == true {
fmt.Println("index = ", index, "为string类型,值为:", value)
} else if value, ok := data.(Student); ok == true {
fmt.Println("index = ", index, "为Student类型,值为:", value)
}
}
}
- switch
for index, data := range i {
switch value := data.(type) {
case int:
fmt.Println("index = ", index, "为int类型,值为:", value)
case string:
fmt.Println("index = ", index, "为string类型,值为:", value)
case Student:
fmt.Println("index = ", index, "为Student类型,值为:", value)
}
}