原神胡想真境剧诗打法攻略12月2025

知识 8171℃

1、通脉自定义圭表类型

在Go言语中有一些根本的表类数据圭表类型,如 string 、型定 整型  、通脉 浮点型 、表类 布尔 等数据圭表类型,型定 Go言语中可独霸 type 关头字来定义自定义圭表类型。通脉

type是表类Go语法里的次要并且经常独霸的关头字,type尽不单是型定对应于C/C++中的typedef。弄了然type的通脉独霸,就随便邃晓go言语中的表类中心定见struct 、inte***ce 、型定函数等的通脉独霸。

2  、表类圭表类型定义

2.1 定义筹划体

独霸 type 可以定义筹划体圭表类型 :

//1
、型定定义筹划体//筹划体定义type person struct {    name string //寄看后背不克不及有逗号   age  int}

2.2 定义接口

独霸 type 可以定义接口圭表类型 :

type USB inte***ce {  start() end()}

2.3 定义其他的新圭表类型

独霸 type  ,还可以定义新圭表类型。

语法 :

type 圭表类型名 Type

示例代码:

type myint inttype mystr stringfunc main() {   var i1 myint  var i2 = 100  i1 = 100  fmt.Println(i1)  //i1 = i2 //cannot use i2 (type int) as type myint in assignment  fmt.Println(i1,i2)    var name mystr  name = "王二狗"  var s1 string  s1 = "李小花"  fmt.Println(name)  fmt.Println(s1)  name = s1 //cannot use s1 (type string) as type mystr in assignment}

2.4 定义函数的圭表类型

Go言语支撑函数式编程,可独霸高阶编程语法 。一个函数可以作为此外一个函数的参数 ,也可以作为此外一个函数的前去值,那么在定义这个高阶函数的时辰,假定函数的圭表类型斗劲宏壮,可独霸type来定义这个函数的圭表类型 :

func main() {   res1 := fun1()  fmt.Println(res1(10,20))}type my_fun  func (int,int)(string)//fun1()函数的前去值是my_func圭表类型func fun1 () my_fun{  fun := func(a,b int) string {   s := strconv.Itoa(a) + strconv.Itoa(b)  return s } return fun}

3、圭表类型别号

圭表类型别号端方 :TypeAlias只是Type的别号,本质上TypeAlias与Type是不合个圭表类型。就像一个孩子小时辰有大年夜大年夜名、乳名 ,上学后用学名,英语教员又会给他起英文名 ,但这些名字都指的是他本身。

圭表类型别号是 Go 1.9 版本添加的新下场 。次要用于代码晋级、迁徙中圭表类型的兼容性问题。在 C/C++言语中,代码重构晋级可独霸宏疾速定义新的一段代码。Go 言语中没有选择介入宏 ,而是将措置重构中最贫穷的圭表类型名变卦问题。

type TypeAlias = Type

在 Go 1.9 版本之前的内建圭表类型定义的代码是多么写的  :

type byte uint8type rune int32

而在 Go 1.9 版本此后变成  :

type byte = uint8type rune = int32

这个改削就是合营圭表类型别号而举办的改削 。

4 、圭表类型定义和圭表类型别号的分辨

圭表类型别号与圭表类型定义外不雅上看只需一个等号的不合,我们经由过程上面的这段代码来邃晓它们之间的分辨。

//圭表类型定义type NewInt int//圭表类型别号type MyInt = intfunc main() {  var a NewInt var b MyInt  fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt fmt.Printf("type of b:%T\n", b) //type of b:int}

下场展示a的圭表类型是 main.NewInt ,展示main包下定义的 NewInt 圭表类型 。b的圭表类型是 int 。 MyInt 圭表类型只会在代码中存在,编译完成时真实不会有 MyInt 圭表类型。

5 、非外埠圭表类型不克不及定义编制

可以尽情地为各类圭表类型起名字,可否意味着可以在本身包里为这些圭表类型肆意添加编制 ?

// 定义time.Duration的别号为MyDurationtype MyDuration = time.Duration// 为MyDuration添加一个函数func (m MyDuration) EasySet(a string) {  //cannot define new methods on non-local type time.Duration}func main() { }

以上代码报错 。报错信息 :cannot define new methods on non-local type time.Duration

编译器提示 :不克不及在一个非外埠的圭表类型 time.Duration 上定义新编制。非外处所法指的就是独霸 time.Duration 的代码地址的包 ,也就是 main 包  。因为 time.Duration 是在 time 包中定义的,在 main 包中独霸  。time.Duration 包与 main 包不在不合个包中,是以不克不及为不在一个包中的圭表类型定义编制 。

措置这个问题有上面两种编制 :

  • 将圭表类型别号改成圭表类型定义:type MyDuration time.Duration  ,也就是将 MyDuration 从别号改成圭表类型。
  • 将 MyDuration 的别号定义放在 time 包中 。

6、在筹划体成员嵌进时独霸别号

当圭表类型别号作为筹划体嵌进的成员时会产生发火甚么气候  ?

type Person struct {  name string}func (p Person) Show() {  fmt.Println("Person-->",p.name)}//圭表类型别号type People = Persontype Student struct {  // 嵌进两个筹划 Person People}func (p People) Show2(){  fmt.Println("People------>",p.name)}func main() {  // var s Student //s.name = "王二狗" //ambiguous selector s.name s.People.name = "李小花" s.Person.name = "王二狗" //s.Show() //ambiguous selector s.Show s.Person.Show() s.People.Show2() fmt.Printf("%T,%T\n",s.Person,s.People) //main.Person,main.Person}

在经由过程s直接访谒name的时辰 ,或s直接调用Show()编制 ,因为两个圭表类型都有 name字段和Show() 编制 ,会产生发火歧义 ,证实People 的本质切实其实是Person 圭表类型 。

到此这篇关于Golang通脉之圭表类型定义的文章就引见到这了,更多相干Go言语 圭表类型定义内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载!