go判断interface类型及类型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go判断interface类型及类型转换相关的知识,希望对你有一定的参考价值。

参考技术A 在golang中,interface允许接纳任意值,类似于Java中的Object类型。

可以直接用 switch value.(type) 来判断类型,如:

如果是单类型判断和转换可以用 v , ok = value.(type) 来判断和转换。

如interface转string:

go(golang)中的类型转换

在使用 go 这样的强类型语言时,我们常常会遇到类型转换的问题。比如 int 类型转 int64,interface{} 转 struct ,对一种类型取指针、解指针等等。今天在这篇文章中我们就来梳理一下,我们在 go 的日常使用中常碰到的几个类型转换场景。

一、显式类型转换

这种类型转换主要在切换同一基础类型不同精度范围时使用,比如我们要将 int 型转为 int64 类型时。

package todo

import "testing"

func Test(t *testing.T) {
	foo := 12

	var bar byte = 18

	t.Logf(" foo + bar = %d", foo+int(bar))
}

// todo_test.go:10:  foo + bar = 30

这种转换方式所使用的语法是 T( ... ) ,直接将变量放置在左侧指明了类型的小括号内。该类型转换要注意的是:类型被转换后是否会损失精度的问题,如果损失了精度是否会影响接下来的业务流程。

二、断言(assert)

断言,顾名思义就是果断的去猜测一个未知的事物。在 go 语言中,interface{} 就是这个神秘的未知类型,其断言操作就是用来判断 interface{} 的类型。

package todo

import "testing"

func Test(t *testing.T) {
	var foo interface{} = 22

	f, ok := foo.(int)
	if !ok {
		t.Log("Guess wrong ...")
	}

	t.Logf("The type is : %T", f)   
}

// todo_test.go:13: The type is : int

断言的语法是 x.( T ),x 指的是类型为 interface{} 的变量,T 是我们断言它可能是的类型。该语法返回两个参数,第一个参数是 x 转化为 T 类型后的变量,第二个值是一个布尔值,若为true 则表示断言成功,false 则表示断言失败。是不是颇有云南赌石的韵味,看准一块石头,认定里面必是上好的翡翠,买下之后拿切割机切开,若恰是一片晶莹碧透,瞬间发财,若石头里面还是石头,额.... 自认倒霉喽。

通常为了提高程序的健壮性,我们会对第二个布尔参数做检查判断,如若判断失败,则做相应的处理。

三、取指针和解指针

go 保留了 C语言 的指针概念,但 go 的指针操作并不复杂,通过符号 & 、* 就能轻松的实现指针与其所对应值的切换。

package todo

import "testing"

type Person struct {
	Name string
	Age  uint8
}

func Test(t *testing.T) {
	p := Person{
		Name: "bar",
		Age:  7,
	}

	per := &p

	t.Logf("The type of per is : %T \n", per)
	t.Logf("After operation , type is : %T", *per)
}

// todo_test.go:18: The type of per is : *todo.Person
// todo_test.go:19: After operation , type is : todo.Person

通过这个简单了例子可见,& 符 可以轻松的将某类型 T 转化为 T 的指针类型(*T),* 符 可轻松实现解指针,将某一类型的指针转化为该指针指向的值的类型。

这是我从类型转换的角度,对 go 常见的类型转换做的一个总结。对于从前端转来学习 go 的同学,或者 node.js 等弱类型语言使用较多的同学,一定在编译时常遇到类型转换的困惑。希望这篇文章能够对大家学习和使用 go 语言有所裨益。

Happy coding ......

以上是关于go判断interface类型及类型转换的主要内容,如果未能解决你的问题,请参考以下文章

[Go] 利用类型断言把interface{}的转换回原类型

Go -- type 和断言 interface{}转换

GO语言map类型interface{}转换踩坑小记

44_类型转换

go(golang)中的类型转换

Golang关于Go中的类型转换