hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 文章 - 后端开发 - 正文 看Cosplay古风插画小姐姐,合集图集打包下载:炫龙网 · 炫龙图库

golang type什么意思_后端开发

2019-12-11后端开发ki4网29°c
A+ A-

type是go语法里的主要而且经常运用的关键字,type毫不只是对应于C/C++中的typedef。type又有两种运用体式格局,一种是范例别号,一种是范例定义,是否是熟习的C言语(define和typedef)滋味?

范例定义

type Student struct {
  name String
  age int
}
type I int

范例别号

type Sdt = Student
type I = int

type有以下几种用法:

定义构造体

定义接口

范例定义

范例别号

范例查询

定义构造体

构造体是用户自定义的一种笼统的数据构造,golang中struct类似于java言语中的class, 在程序设计中,有着无足轻重的职位。构造体的用法,将会在struct关键字中细致的引见。下边来看一下定义一个构造体的语法花样:

type name struct {
    Field1  dataType
    Field2  dataType
    Field3  dataType
}

定义接口

接口相干知识点,将会在interface关键字中细致引见,下边来看一段定义接口的语法花样:

type name interface{
    Read()
    Write()
}

范例定义

运用范例定义定义出来的范例与原范例不相同,所以不能运用新范例变量赋值给原范例变量,除非运用强迫范例转换。下面来看一段示例代码,依据string范例,定义一种新的范例,新范例名称是name:

type name string

为何要运用范例定义呢?

范例定义能够在原范例的基础上制造出新的范例,有些场所下能够使代码越发简约,以下边示例代码:

package main
import (
  "fmt"
)
// 定义一个吸收一个字符串范例参数的函数范例
type handle func(str string)
// exec函数,吸收handle范例的参数
func exec(f handle) {
  f("hello")
}
func main() {
  // 定义一个函数范例变量,这个函数吸收一个字符串范例的参数
  var p = func(str string) {
    fmt.Println("first", str)
  }
  exec(p)
  // 匿名函数作为参数直接通报给exec函数
  exec(func(str string) {
    fmt.Println("second", str)
  })
}

输出信息是:

first hello
second hello

上边的示例是范例定义的一种简朴运用场所,如果不运用范例定义,那末想要完成上边示例中的功用,应当怎样誊写这段代码呢?

// exec函数,吸收handle范例的参数
func exec(f func(str string)) {
  f("hello")
}

exec函数中的参数范例,须要替换成func(str string)了,咋一看去也不庞杂,然则如果exec吸收一个须要5个参数的函数变量呢?是否是觉得参数列表就会很长了。

func exec(f func(str string, str2 string, num int, money float64, flag bool)) {
  f("hello")
}

从上边的代码能够发明,exec函数的参数列表可读性变差了。下边再来看看运用范例定义是怎样完成这个功用:

package main
import (
  "fmt"
)
// 定义一个须要五个参数的函数范例
type handle func(str string, str2 string, num int, money float64, flag bool)
// exec函数,吸收handle范例的参数
func exec(f handle) {
  f("hello", "world", 10, 11.23, true)
}
func demo(str string, str2 string, num int, money float64, flag bool) {
  fmt.Println(str, str2, num, money, flag)
}
func main() {
  exec(demo)
}

范例别号

范例别号这个特征在golang1.9中引入。运用范例别号定义出来的范例与原范例一样,即能够与原范例变量相互赋值,又具有了原范例的一切要领集。给strng范例取一个别号,别号名称是name:

type name = string

范例别号与范例定义不同之处在于,运用范例别号须要在别号和原范例之间加上赋值标记(=);运用范例别号定义的范例与原范例等价,而运用范例定义出来的范例是一种新的范例。

以下边示例:

package main
import (
  "fmt"
)
type a = string
type b string
func SayA(str a) {
  fmt.Println(str)
}
func SayB(str b) {
  fmt.Println(str)
}
func main() {
  var str = "test"
  SayA(str)
  
  //毛病参数通报,str是字符串范例,不能赋值给b范例变量
  SayB(str)
}

这段代码在编译时会涌现以下毛病:

.\main.go:21:6: cannot use str (type string) as type b in argument to SayB

从毛病信息可知,str为字符串范例,不能当作b范例参数传入SayB函数中。而str却能够当作a范例参数传入到SayA函数中。因而可知,运用范例别号定义的范例与原范例一致,而范例定义定义出来的范例,是一种新的范例。

给范例别号新增要领,会添加到原范例要领集合

给范例别号新增要领后,原范例也能运用这个要领。下边请看一段示例代码:

package main
import (
  "fmt"
)
// 依据string范例,定义范例S
type S string
func (r *S) Hi() {
  fmt.Println("S hi")
}
// 定义S的范例别号为T
type T = S
func (r *T) Hello() {
  fmt.Println("T hello")
}
// 函数参数吸收S范例的指针变量
func exec(obj *S) {
  obj.Hello()
  obj.Hi()
}
func main() {
  t := new(T)
  s := new(S)
  exec(s)
  // 将T范例指针变量通报给S范例指针变量
  exec(t)
}

输出信息是:

T hello
S hi
T hello
S hi

上边的示例中,S是原范例,T是S范例别号。在给T增加了Hello要领后,S范例的变量也能够运用Hello要领。申明给范例别号新增要领后,原范例也能运用这个要领。从示例中可知,变量t能够赋值给S范例变量s,所以范例别号是给原范例取了一个奶名,本质上没有发生任何变化。

范例别号,只能对同一个包中的自定义范例发生作用。举个例子,golang sdk中有很多个包,是否是我们能够运用范例别号,给sdk包中的构造体范例新增要领呢?答案是:不可。请切记一点:范例别号,只能对包内的范例发生作用,对包外的范例采纳范例别号,在编译时将会提醒以下信息:

cannot define new methods on non-local type string

范例查询

范例查询,就是依据变量,查询这个变量的范例。为何会有如许的需求呢?goalng中有一个特别的范例interface{},这个范例能够被任何范例的变量赋值,如果想要晓得究竟是哪一个范例的变量赋值给了interface{}范例变量,就须要运用范例查询来处理这个需求,示例代码以下:

package main
import (
  "fmt"
)
func main() {
    // 定义一个interface{}范例变量,并运用string范例值”abc“初始化
    var a interface{} = "abc"
    
    // 在switch中运用 变量名.(type) 查询变量是由哪一个范例数据赋值。
    switch v := a.(type) {
    case string:
      fmt.Println("字符串")
    case int:
        fmt.Println("整型")
    default:
      fmt.Println("其他范例", v)
    }
}

如果运用.(type)查询范例的变量不是interface{}范例,则在编译时会报以下毛病:

cannot type switch on non-interface value a (type string)

如果在switch之外处所运用.(type),则在编译时会提醒以下毛病:

use of .(type) outside type switch

所以,运用type举行范例查询时,只能在switch中运用,且运用范例查询的变量范例必需是interface{}

ki4网,有大批免费的Golang入门教程,迎接人人进修!

以上就是golang type什么意思的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
golang type什么意思_后端开发

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签:

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>