package main
import (
. "fmt" //点的作用是以后使用到fmt包中的函数,可以省略fmt.直接写函数名
//如 fmt.Println() 可以直接写为Println()
"math"
)
func main() {
Println("测试")
//GOTO跳转
for i := 0; i < 10; i++ {
if i == 5 {
goto GOHere
} else {
Println(i)
}
}
GOHere:
Println("GOTO到此处!")
//函数的调用,修改地址内的值
b := 3
a := changeVal(&b)
Println("改变的值:", a)
//变参函数的调用
changeCan(1, 2, 3)
changeCan(1, 2, 3, 4, 5)
//defer采用后进先出模式
for i := 5; i > 0; i-- {
defer Println("defer输出值:", i)
}
//Stract结构使用
var p Human
p.Name = "john"
p.Age = 21
p.Height = 1.70
p.Sex = true
Println("一般赋值为:", p)
q := Human{"Cena", 18, 1.68, false}
Println("简略赋值为:", q)
k := Human{Age: 20, Height: 1.75, Sex: true, Name: "Juff"}
Println("指定字段赋值为:", k)
//比较年龄
l, r, t := CompareAge(p, q)
Println("年龄大的是:", l, "年龄为:", r, "身高为:", t)
//比较身高
s, u, v := CompareHeight(q, k)
Println("身高高的是:", s, "年龄为:", u, "身高为:", v)
//得到性别为男的
z := GetSex(p, q, k)
Println("男的有:", z)
//struct的重写
Bob := Employee{Person{"Bob", 44, "12345678"}, "Enginer", "abcdefgh"}
Println("Bob的基本信息是:", Bob, "Bob的电话:", Bob.Phone, "Bob的电话1:", Bob.Person.Phone)
//方法的使用
Chang := Rectange{2, 3}
Println("长方形的面积是:", Chang.Areas())
Yuan := Circle{3}
Println("圆形的面积是:", Yuan.Areas())
changdu := "123456789"
Println("长度的测试:", len(changdu))
//结构体的混合使用
boxes := BoxList{
Box{4, 4, 4, RED},
Box{10, 10, 1, YELLOW},
Box{1, 1, 20, BLACK},
Box{10, 10, 1, BLUE},
Box{20, 30, 20, WHITE},
Box{10, 20, 20, YELLOW},
}
Println("列表的长度:", len(boxes))
Println("第一个的体积是:", boxes[0].Tiji(), "cm³")
Println("最后一个的颜色是:", boxes[len(boxes)-1].color.String())
Println("最大的体积的颜色是", boxes.BiggestsColor().String())
Println("设置所有的颜色为BLACK")
boxes.PrintBlack()
Println("颜色是:", boxes[4].color.String())
Println("体积最大的颜色是:", boxes.BiggestsColor().String())
}
//地址函数
func changeVal(a int) int {
a = a + 1 // 修改了a的值
return a // 返回新值
}
//变参函数
func changeCan(arg ...int) {
for _, n := range arg {
Println("参数是:", n)
}
}
//Struct结构声明
type Human struct {
Name string
Age int
Height float64
Sex bool
}
//Struct作为函数的参数
func CompareAge(p1, p2 Human) (Human, int, float64) {
if p1.Age > p2.Age {
return p1, p1.Age, p1.Height
} else {
return p2, p2.Age, p2.Height
}
}
func CompareHeight(p1, p2 Human) (Human, int, float64) {
if p1.Height > p2.Height {
return p1, p1.Age, p1.Height
} else {
return p2, p2.Age, p2.Height
}
}
//模糊查询
func GetSex(arg ...Human) (result [3]Human) {
for k, v := range arg {
if v.Sex == true {
result[k] = v
}
}
return result
}
//struct重写
type Person struct {
Name string
Age int
Phone string
}
type Employee struct {
Person
Postion string
Phone string
}
//Method方法
//虽然method的名字一模一样,但是如果接收者不一样,那么method就不一样
//method里面可以访问接收者的字段
//调用method通过.访问,就像struct里面访问字段一样
type Rectange struct {
Width, Height float64
}
type Circle struct {
R float64
}
func (r Rectange) Areas() float64 {
return r.Width r.Height
}
func (c Circle) Areas() float64 {
return c.R c.R * math.Pi
}
//静态变量颜色列表
const (
WHITE = iota
BLACK
RED
YELLOW
BLUE
)
type Color byte
type Box struct {
width, height, depth float64
color Color
}
//切片
type BoxList []Box
//计算体积
func (B Box) Tiji() float64 {
return B.width B.height B.depth
}
//设置颜色
//此处采用指针作为对象的原因是,改变的值是对象的内存中的值,而不是取出的对象的值
//AA取出的是AA对象的内存值,AA取出的是AA对象的copy值
//若是修改AA对象的值,则采用指针的方式
//若是去除AA对象的值,则采用Copy的方式
func (b Box) SetColor(c Color) {
b.color = c
}
//比较体积的最大值,设置颜色
func (bl BoxList) BiggestsColor() Color {
v := 0.00
k := Color(WHITE)
for _, b := range bl {
if b.Tiji() > v {
v = b.Tiji()
k = b.color
}
}
return k
}
//设置颜色全为BLACK
func (bl BoxList) PrintBlack() {
for i, _ := range bl {
bl[i].SetColor(BLACK)
}
}
func (c Color) String() string {
strings := []string{"WHITE", "BLACK", "BLUE", "RED", "YELLOW"}
return strings[c]
}