Go语言中文网 为您找到相关结果 28

go类型断言

go里面的类型断言写法: x.(T) 其中x为interface{}类型 T是要断言的类型。 类型断言有个非常好的使用场景:当某个类型为interface{}的变量,真实类型为A时,才做某件事时,这时可以使用类型断言 下面有个例子。只有当某个interface{}的类型 存储的是int时才打印出来。 package main import ( "fmt" "math/rand" "time" ) func main() { var v interface{} r := rand.New(rand.NewSource(time.Now().UnixNano())) for i := 0; i < 10; i++{ v = i if (r.Intn(100) % 2) == 0 { v = "h...阅读全文

博文 2015-05-19 23:00:02 guonaihong

golang 接口interface{}、断言、switch type

interface{} 可以接受任何类型的对象值 获取interface{}队形的数据类型,可以使用断言,或者 switch type 来实现 // Assertion project main.go package main import ( "fmt" ) type Bag struct { Key string } type Bag2 struct { Key int } func main() { var b1 interface{} var b2 interface{} b1 = Bag{Key: "1"} b2 = Bag2{Key: 0} //获取interface{}中存放的数据类型 //方法一: { //判断是否是Bag类型 若不是则置0 b, ok := b1.(Bag)...阅读全文

博文 2016-03-03 16:00:01 xia_xing

golang追加写入文件

所有语言你想调试都可以下断言调试,当然也可以输出到日志文件中,此函数方便集成到你的项目中。//打印内容到文件中 //tracefile(fmt.Sprintf("receive:%s",v)) func tracefile(str_content string) { fd,_:=os.OpenFile("a.txt",os.O_RDWR|os.O_CREATE|os.O_APPEND,0644) fd_time:=time.Now().Format("2006-01-02 15:04:05"); fd_content:=strings.Join([]string{"======",fd_time,"=====",str_content,"\n"},"") buf:=[]byte(fd_con...阅读全文

博文 2016-11-01 17:00:01 e421083458

GO语言Comma-ok断言

Comma-ok断言的语法是:value, ok := element.(T)。element必须是接口类型的变量,T是普通类型。如果断言失败,ok为false,否则ok为true并且value为变量的值。来看个例子: package main import ( "fmt" ) type Html []interface{} func main() { html := make(Html, 5) html[0] = "div" html[1] = "span" html[2] = []byte("script") html[3] = "style" html[4] = "head" for index, element := range html { if value, ok := elem...阅读全文

博文 2016-08-16 10:00:22 alvine008

golang 断言 + 类型转换

自博客园http://my.oschina.net/u/157514/blog/148285 golang 语言中 也有类似javascript 的 typeof 判断类型的 方法 比如 func (a interface{}){ //第一种 if inst,ok:=a.(TypeA);ok{ inst.MethodA() } //第二种 switch inst:=a.(type){ case TypeA: inst.MethodA() default: fmt.Println("unknow") } } a可能是任意类型 a.(某个类型) 返回两个值 inst 和 ok ,ok代表是否是这个类型,Ok如果是 inst 就是转换后的 类型 a.(type) type是关键字 结合switch...阅读全文

博文 2015-06-17 20:03:49 u012210379

golang:interface{}类型测试

在golang中空的interface即interface{}可以看作任意类型, 即C中的void *. 对interface{}进行类型测试有2种语法: 1. Comma-ok断言: value, ok = element.(T), 其中T是具体类型. 2. Switch测试: switch element.(type) { case T1: case T2: default: } 其中T1, T2是具体类型. 注意: element.(type)语法不能在switch外的任何逻辑里使用. 在switch外必须使用comma-ok断言或者反射: reflect.TypeOf(element) reflect.ValueOf(element...阅读全文

博文 2016-09-07 07:00:02 zolo

Go Test 少为人知的特性

大部分 gophers 们都知道和喜爱 go test 工具,知道运行 go test 可以进行包测试,然而关于 go test 还有很多隐藏在背后的特性。 1、黑盒测试包(以 _test 结尾的包) 2、Skipping 测试 3、并行测试 4、其他,如 性能测试;覆盖率;断言等等 [点击查看原文](https://blog.splice.com/lesser-known-features-go-test/) ...阅读全文

regexp

为什么使用regexp无法进行前向断言 img src="http://www.baidu.com/a.jpg" r, _ := regexp.Compile(`(?=img src=").+jpg`) 为啥吗报错呢。。runtime错误 panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x74 pc=0x8895d] goroutine 1 [running]: sync/atomic.CompareAndSwapUint32() ...阅读全文

golang解析json配置文件

安装 go get github.com/akkuman/parseConfig 使用说明 环境假设 . ├── config.go ├── config.json config.json内容 { "name" : "akkuman", "urls" : ["xx.com","ww.com"], "info" : { "qq" : "123456", "weixin": "123456" } } 该库取出来的都是类型为interface{}的数据,如需取出具体类型的数据需要自己加断言 当取嵌套map数据的时候,以“ > ”指定下一级,注意>两边均有空格,具体见下面的例子 例子 config.go内容 package main import ( "github.com/akkuman/pars...阅读全文

博文 2017-10-26 09:00:01 Akkuman

Golang之interface(多态,类型断言)

多态用法 package main //一种事物的多种形态,都可以按照统一的接口进行操作 //多态 import ( "fmt" "math/rand" "sort" ) type Student struct { Name string Id string Age int sortType int } type Book struct { Name string Author string } //切片默认传地址 type StudentArray []Student func (p StudentArray) Len() int { return len(p) } func (p StudentArray) Less(i, j int) bool { return p[i].Name <...阅读全文

博文 2018-01-15 07:30:01 pyyu

golang 类型断言

golang类型断言 类型断言是一个使用在接口值上的操作 有时候,我们可能需要知道某个接口类型的实际类型,比如某个方法需要接收多种类型的数据并需要做分别处理,我们可以把形参设为空接口类型并接收任意类型的值,但是我们怎么反向知道里面实际保存的是哪个类型的对象呢? Comma-ok 断言 语法 value,ok := x.(T) x表示一个接口的类型,T表示一个类型(也可为接口类型) 该断言表达式会返回x的值和一个布尔值 可根据该布尔值判断x是否为T类型 如: func main() { var x interface{} x = 10 value, ok := x.(int) f...阅读全文

golang interface

interface 类型断言 interface的变量里面可以存储任意类型类型数据 (原理: 任何类型都实现了空接口的方法【空方法】 ) 断言 value , ok:=elemet.(T) T 是断言的类型, element 是interface的值, ok bool类型, 判断是否是T类型, value 断言后的值 例 func main() { list :=make([]interface{},3) list[0]="qqq" list[1]=111 for _, data := range list { value, ok := data.(int) if ok { fmt.Println(value) fmt.Printf("%T",value) } } ``...阅读全文

博文 2018-12-27 23:34:42 husky_1

断言的疑惑

请问下: 下面的示例代码中,为什么第二种断言才能成功,第一种断言不成功? ``` json1 := `[{"aa":"astr1"},{"aa":"bstr1"}]` var j1 []interface{} json.Unmarshal([]byte(json1), &j1) for k, v := range j1 { fmt.Println(k, reflect.TypeOf(v).String()) if v2, ok := v.(map[string]string); ok { println("断言成功") println(v2["aa"]) } else if v2, ok := v.(map[string]inter...阅读全文

空接口(interface {})类型判断

空接口可以存储任意类型的数据,当需要判断到底是何种类型时,可以使用以下方法。 1 直接断言 比如我们收到一个类型为interface{}的变量unknown,可以通过如下代码直接断言是否为string类型: val, ok := unknow.(string) 如果返回ok为true,则变量unknown为string类型,同时返回一个val存储string类型的值。如果我们确定unknown为string类型,也可以不返回ok变量,直接强转获取其值: val := unknow.(string) 但是使用这种方法有一定的风险,如果不是string类型,会发生panic: panic: interface conversion: interface {} is int, not string...阅读全文

博文 2019-08-01 21:02:45 moonbamboo

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

简单记录下平时开发对类型断言(Type Assertion)的使用场景。1.用于转换函数里interface{}类型的参数golang里的所有类型都实现了空接口interface{},所以通常将它作为一个函数的抽象类型的参数。举个简单栗子: package main import "fmt" func main() { add(1, 2) add(int16(1), int16(2)) add(float32(1.1), float32(2.2)) add(float64(1.1), float64(2.2)) add(true, false) } func add(a, b interface{}) { switch t := a.(type) { case int: fmt.Printf...阅读全文

博文 2017-12-19 12:04:54 Cedrus

关于Go中new函数方法中的Type怎么差看不了?

因为我想实现一个功能是传入一参数,通过获取这个参数的类型返回该参数类型的数据,例如:Go中的函数new 和 make 伪代码: ```go func getValue(obj interface{})Type{ // 通过断言得知该类型 v:=obj.(string) return v } ``` 返回后直接就是一个string 这个该如何实现? ...阅读全文

Go语言的断言返回值和类型转换的区别

1.类型转换 (1)、语法:<结果类型> := <目标类型> ( <表达式> ) (2)、类型转换是用来在不同但相互兼容的类型之间的相互转换的方式,所以,当类型不兼容的时候,是无法转换的。 例如 各种int类型,[]byte和string类型 2.类型断言 二、类型断言 (1)语法: <目标类型的值>,<布尔参数> := <表达式>.( 目标类型 ) // 安全类型断言 <目标类型的值> := <表达式>.( 目标类型 ) //非安全类型断言 (2)类型断言的本质,跟类型转换类似,都是类型之间进行转换,不同之处在于,类型断言实在接口之间进行。 (3) 在switch中 <目标类型的值> := <表达式>.( type )后,case 目标类...阅读全文

golang 能不能用类型检测结果,来声明变量或作类型断言?

比如,我想写一个函数,求切片内最大值,我还想让它通用,适用于[]int, []float64各种类型的切片 ,于是我这样写 ```go func max(i interface{}) interface{} { t := reflect.TypeOf(i) arr := i.(t) // 当然这样是不行的,只是表达我的想法,能动态识别类型,作类型断言,再使用 max := arr[0] for _, v := range arr { if v > max { max = v } } return max } ``` 我想动态识别接口的实际类型,然后用这个类型,做类型断言 ,达到通用化的目的,能做到吗?...阅读全文

Go获取文件的 创建时间, 还有 Windows 和 Linux 的系统差异吗?

获取文件创建时间, 有 Win 和 Linux 差异? 要针对不同的系统,作判断吗? ~~~ package main import ( "os" "fmt" ) func timespecToTime(ts syscall.Timespec) time.Time { return time.Unix(int64(ts.Sec), int64(ts.Nsec)) } func main() { finfo, _ := os.Stat("1.txt") // Sys()返回的是interface{},所以需要类型断言,不同平台需要的类型不一样,linux上为*syscall.Stat_t stat_t...阅读全文

go断言小记(转)

### 1.类型转换断言 ```golang var v interface{} = 1 // 类型断言成功 v1, ok := v.(int) fmt.Println(v1, ok) // 1 true // 类型断言失败 有ok 则不会panic 并返回断言的类型的零值,在这里是float64的零值:0 v2, ok := v.(float64) fmt.Println(v2, ok) // 0 false // 类型断言失败 无ok 则直接panic v3 := v.(string) // 将直接panic ``` ### 2.map中key值存在断言 ```golang // key存在的断言成功 有ok m := ma...阅读全文