golang类型断言

什么是类型断言

因为接口是一般类型,不知道具体类型,如果要转成具体类型就要使用类型断言

先看简单的(报错的代码)

package main

import "fmt"

type Point struct {
	x int
	y int
}

func main() {
	var a interface{}
	p := Point{1,2}
	a =p
	var b Point
	b = a//这里会报错
	fmt.Println(b)
}

用类型断言,没用类型断言无法确定a就是Point类型:

package main

import "fmt"

type Point struct {
	x int
	y int
}

func main() {
	var a interface{}
	p := Point{1,2}
	a =p
	var b Point
	b = a.(Point)
	fmt.Println(b)
}

再看一段:

package main

import "fmt"

type Usb interface {
	Start()
	Stop()
}

type Phone struct {
	name string
}
func (this Phone) Start() {
	fmt.Println("the phone is start working ")
}
func (this Phone) Call() {
	fmt.Println("calling..")
}
func (this Phone) Stop() {
	fmt.Println("the phone is stop working")
}

type Camera struct {
	name string
}
func (this Camera) Start() {
	fmt.Println("Camera is start working")
}
func (this Camera) Stop() {
	fmt.Println("Camera is stop")
}

type Computer struct {

}

func (this Computer) Working(usb Usb)  {
	usb.Start()
	if phone,ok := usb.(Phone); ok {
		phone.Call()
	}
	usb.Stop()
}

func main() {
	c :=Computer{}
	phone1 :=Phone{"小米"}
	phone2 := Phone{"华为"}
	camera := Camera{"索尼"}
	var usbarr [3]Usb
	usbarr[0] = phone1
	usbarr[1] = phone2
	usbarr[2] = camera
	for _,v:= range usbarr {
		c.Working(v)
	}
}

原文地址:https://www.cnblogs.com/cfc-blog/p/10392776.html

时间: 2024-12-15 16:04:07

golang类型断言的相关文章

golang 类型断言的学习

在php中有一个 serialize() 函数 可以把数组序列化成字符串进行存储和传输 如果想反序列化这种字符串,在php中只需要一个简单的unserialize() 函数就可以完成了.但是在golang中可就没有这么容易了,非得费个九牛二虎之力,写上不少代码才行. 这时候只想感叹一下,php真的是世界上最好的语言啊! 我就在今天的开发中遇到了这么个问题,需要使用golang去解析php序列化的字符串,在github上找了个解析的包,但是发现解析之后的结果是个interface{}类型. 顿时我

golang类型断言的使用(Type Assertion)

第一部分 首先,转自https://studygolang.com/articles/3314对断言的基本介绍 golang的语言中提供了断言的功能.golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口,这种做法和java中的Object类型比较类似.那么在一个数据通过func funcName(interface{})的方式传进来的时候,也就意味着这个参数被自动

类型断言的最佳实践

Golang语言中的类型断言的最佳实践 利用函数typejudge 来判断传入的实参是什么类型,并打印出它的类型及数值 package main import( "fmt" _"sort" _"math/rand" ) type Wisdom struct{ name string } func TypeJuDge (Items... interface{}) { for index, value := range Items { switch

GO语言总结(5)——类型转换和类型断言

上一篇博客介绍了Go语言的数组和切片——GO语言总结(4)——映射(Map),本篇博客介绍Go语言的类型转换和类型断言 由于Go语言不允许隐式类型转换.而类型转换和类型断言的本质,就是把一个类型转换到另一个类型. 一.类型转换 (1).语法:<结果类型> := <目标类型> ( <表达式> ) (2).类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,所以,当类型不兼容的时候,是无法转换的.如下: func test4() { var var1 int = 7

go类型断言

go里面的类型断言写法: x.(T) 其中x为interface{}类型 T是要断言的类型. 类型断言有个非常好的使用场景:当某个类型为interface{}的变量,真实类型为A时,才做某件事时,这时可以使用类型断言 下面有个例子.只有当某个interface{}的类型 存储的是int时才打印出来. package main import (     "fmt"     "math/rand"     "time" ) func main() {

类型转换和类型断言

概述 由于Go语言不允许隐式类型转换,不同的类型之间的转换必须做显示的类型转换.而类型转换和类型断言的本质,就是把一个类型转换到另一个类型. 不过Go语言必须做显示的类型转换的要求也有例外的情况: 当普通 T 类型变量向 I 接口类型转换时,是隐式转换的(编译时转换):(T->I) 当 IX 接口变量向I接口类型转,是隐式转换的(编译完成时转换的):(I->I) 类型之间转换的例子 下面是Go语言规范给出的部分例子: *Point(p) // same as *(Point(p)) (*Poi

typeScript-基础知识-4-8类型断言

类型断言: 类型断言(Type Assertion)可以用来手动指定一个值的类型. 语法 <类型>值 或 值 as 类型 在 tsx 语法(React 的 jsx 语法的 ts 版)中必须用后一种. 例子:将一个联合类型的变量指定为一个更加具体的类型 之前提到过,当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法: function getLength(something: string | number): number

接口——定义,实现接口的条件,类型与接口的关系,类型断言

1.定义 Go 语言的接口设计是非侵入式的,接口编写者无须知道接口被哪些类型实现.而接口实现者只需知道实现的是什么样子的接口,但无须指明实现哪一个接口.编译器知道最终编译时使用哪个类型实现哪个接口,或者接口应该由谁来实现. 每个接口类型由数个方法组成.接口的形式代码如下: type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 …} 说明: 接口类型名:使用 type 将接口定义为自定义的类型名.Go语言的接口在命名时,一般

类型断言

package main import ( "fmt" ) func main() { var p *person = new(person) fmt.Println(p) // i := make([]interface{}, 3) //切片类型:空接口,长度:3 i[0] = 9 i[1] = "string" i[2] = person{"张三", 30} fmt.Printf("%T\n", i) for index,