标签:int() 断言 没有 rgs The 一个 method nod 包含
接口定义了一个对象的行为规范,制定以规范并不实现,具体的对象需要实现规范的细节
//接口定义
type 接口名 interface { //定义一个接口
Talk()
Eat() int //返回int型
Run()
}
一个对象只要包含接口中的方法,那么就是实现了这个接口,接口类型的变量可以保存具体类型的实例
type Animal interface{
Talk()
Eat()
Name() string
}
type Dog struct{
}
func (d Dog) Talk(){
fmt.Println("汪汪")
}
func (d Dog) Eat(){
fmt.Println("吃骨头")
}
func (d Dog) Name() string{
fmt.Println("旺财")
return "旺财"
}
func test(){
var b Dog
var a Animal
a = b
a.Name()
a,Eat()
a.Talk()
}
type Student struct {
Name string
Id string
Age int
}
type StudentArray []Student
func (p StudentArray) Len() int {
return len(p)
}
func (p StudentArray) Less(i, j int) bool {
return p[i].Name > p[j].Name
}
func (p StudentArray) Swap(i,j int) {
p[i],p[j] = p[j],p[i]
}
func test(){
var stus StudentArray
for i := 0;i<10;i++{
stu := Student{
Name : fmt.Sprintf("stu%d",rand.Intn(100)),
Id : fmt.Sprintf("110%d",rand.Intn()),
Age : randIntn(100),
}
stus = append(stus,stu)
}
for _,v := range stus{
fmt.Println(v)
}
fmt.Println("\n\n")
sort.Sort(stus)
for _,v := range stus{
fmt.Println(v)
}
}
空接口没有定义任何方法,所以任何类型都能实现空接口
func test(){
var a interface{}
var b int = 100
a = b
fmt.Printlf(%T %v\n",a,a) //int 100
var c string = "hi"
a = c
fmt.Printf("%T %v\n",a,a) //string hi
var d map[string]int = make(map[string]int,10)
d["abc"] = 100
d["aaa"] = 30
a = d
fmt.Printf("%T %v\n",a,a) //map[string]int map[abc:100 aaa:30]
}
func Descrtribe(a interface{}){
fmt.Printf("type = %T %v\n",a,a)
}
type Student struct{
Name string
Sex int
}
func test2(){
a := 99
describe(a) //type=int 99
b := "hello"
describe(b) //type = string hello
var stu Student = Student{
Name:"user01",
Sex:1,
}
describe(stu) //type = main.Student {user01 1}
}
获取接口类型里面存储的具体值
//OK语句判断
func describe(a interface{}) {
s,ok := a.(int)
if ok { //使用ok语法,防止传入类型错误报错
fmt.Println(s)
return
}
str,ok := a.(string)
if ok{
fmt.Println(str)
return
}
f,ok := a.(float32)
if ok {
fmt.Println(f)
return
}
fmt.Println("输入错误")
return
}
func test(){
var a int = 100
describe(a)
var b string = "hi"
describe(b)
}
//sitch-type语句判断
func testSwitch(a interface{}) {
switch v := a.(type) {
case stirng:L
fmt.Printf("a is string,value:%v\n",v)
case int:
fmt.Printf("a is int,value:%v\n", v)
case float32:
fmt.Printf("a is float32,value:%v\n", v)
default:
fmt.Println("not support type\n")
}
}
func test2(){
var a int = 100
testSwitch(a)
var b string = "Parallel"
testSAwitch(b)
}
值类型实现的接口指针类型变量可以存入,指针类型实现的接口值类型变量不能存入
//同一兑现够可以实现多个接口
type Animal interface{
Talk()
}
type Bu interface{
Bu()
}
type Dog struct{
}
func (d Dog) Talk(){
fmt.Println("汪汪")
}
func (d Dog) Bu(){
fmt.Println(*狗是哺乳动物")
}
func test(){
var d Dog
var a Animal
a = d
a.Talk()
var b Bu
b = d
b.Bu()
}
type LinkNode struct{
data interface{}
next *LinkNode
}
type Link struct {
head *LinkNode
tail *LikNode
}
func (p *Link) InsertHead(data interface{}) {
node := &LinkNode{
data : data,
next : nil,
}
if p.taiil == nil && p.head == nil{
p.tail = node
p.head = node
return
}
node.next = p.head
p.head = node
}
func (p *Link) InsertTail(data interfdace{}) {
node := &LinkNode{
data : data,
next : nil,
}
if p.tail == nil && p.head{
p.tail = node
p.head = node
reutrn
}
p.tail.next = node
p.tail = node
}
func (p *Link) Trans(){
q := p.head
if q != nil {
fmt.Println(q.data)
q = q.next
}
}
func main(){
var intLink Link
for i := 0;i<10;i++{
intLink.InsertHead(i)
intLink.InsertTail(i)
}
intLink.Trans()
}
接口嵌套
type Animal interface {
Eat()
}
type Describle interface {
Describled()
}
type AdvanceAnimal interface {
Animal
Describle
}
type Dog struct {
}
func (d Dog) Eat() {
fmt.Println("狗吃屎")
}
func (d Dog) Describled() {
fmt.Println("狗")
}
func test() {
var d Dog
var a AdvanceAnimal
a = d
a.Eat()
a.Describled()
}
空接口可以存储任何类型的变量,在运行时动态的获取一个变量的类型信息和值信息就是反射
//获取类型信息:reflect.TypeOf
import {
"fmt"
"reflect"
}
func reflect_example(a interface{}) {
t := reflect.TypeOf(a)
fmt.Printf("type of a is:%v\n",t)
}
func test(){
var x float32 = 3.4
reflect_example(x)
}
//获取变量的类型:Type.Kind()
import (
"fmt"
"reflect"
}
func reflect_example(a interface{}) {
t := reflect.TypeOf(a)
fmt.Printf("type of a is :%v\n",t)
k := t.Kind()
switch k {
case reflect.Int64:
fmt.Println("a is int64")
case reflect.String:
fmt.Printf("a is string")
}
}
func test() {
var x float32 = 3.4
reflect_example(x)
}
//获取值信息:reflect.ValueOf
func reflect_value(a interface{}) {
v := reflect.ValueOf(a)
k := v.Kind()
switch k {
case reflect.Int64:
fmt.Printf("a is int64,value is :%d",v.int())
case reflect.Float64:
fmt.Printf("a is Float64,value is:%f",v.Float())
}
}
func test() {
var x float64 = 3.4
reflect_value(x)
}
//反射设置变量值:value.Elem().SetFloat()
func reflect_set_value(a interface{}) {
v := reflect.ValueOf(a)
k := v.Kind()
switch k {
case reflect.Int64:
v.SetInt(100)
fmt.Printf("a is int64,value is :%d",v.Int())
case reflect.Float64:
v.SetFloat(6.8)
fmt.Printf("a is Float64,value is:%f",v.Float())
case reflect.Ptr:
fmt.Printf("set a to 6.8\n")
qv.Elem().SetFloat(6.8) //Elem()相当于指针赋值中的*
}
}
func test() {
var x float64 = 3.4
reflect_set_valur(&x)
fmt.Printf("x value is %v\n",x)
}
/*
注:
var *p int = new(int)
*p = 100 //正常指针赋值,设置的值需要和变量类型匹配
*/
获取和设置结构体字段的信息
//获取结构体信息
type Student struct {
Name string
Sex int
Age int
}
func test(){
var s Student
v := reflect.ValueOf(s)
t := v.Type()
kind := t.Kind()
switch kind {
case reflect.Int64:
fmt.Printf("s is int64\n")
case reflect.Float32:
fmt.Println("s is Float32\n")
case reflect.Struct:
fmt.Printf("s is struct\n")
fmt.Printf("field num of s is %d\n",v.NumField()) //获取结构体的参数个数用NumField()
for i:= 0;i<v.NumField();i++ {
field := v.Field(i)
fmt.Printf("name:%s type:%v value:%v\n",t.Field(i).Name,field.Type(),field.Interface())
}
default:
fmt.Println("default")
}
}
//设置结构体相关字段的值
type Student struct {
Name stirng
Sex int
Age int
}
func test(){
var s Student
v := reflect.ValueOf(&s)
v.Elem().Field(0).SetString("stu01")
v.Elem().FieldByName("Sex").SetInt(2)
v.Elem().FieldByName("Age").SetInt(15)
fmt.Printf("s:%#v\n",s)
}
//获取结构体的方法信息
type Student struct {
Name string
Sex int
Age int
Score float32
}
func (s *Student) SetName(name string) {
s.Name = name
}
func (s *Student) Print(){
fmt.printf("%#v\n",s)
{
func test(){
var s Student
s.SetName("xxx")
v := reflect.ValueOf(&s)
t := v.Type()
fmt.Printf("struct student have %d methods\n",t.NumMethod())
for i := 0;i<NumMethod();i++ {
method := t.Method(i)
fmt.Printf("struct %d method,name:%s type :%v\n",i,method.Name,method.Type)
}
}
//调用结构体中的方法
type Student struct {
Name string
Sex int
Age int
Score float 32
}
func (s *Student) SetName(name string) {
s.Name = name
}
func (s *Student) Print() {
fmt.Printf("%#v\n",s)
}
func test2() {
var s Student
s.SetName("xxx")
v := reflect.ValueOf(&s)
m1 := v.MethodByName("Print")
var args []reflect.Value
m1.Call(args)
//调用有参数结构体的方法
m2 := v.MethodByName("SetName")
var args2 []reflect.Value
name := "stu01"
nameVal := reflect.ValueOf(name)
args2 = append(args2,nameVal)
m2.Call(args2)
m1.Call(args)
}
标签:int() 断言 没有 rgs The 一个 method nod 包含
原文地址:https://www.cnblogs.com/parallel-Y/p/11420757.html