Go学习笔记-类型

这篇具有很好参考价值的文章主要介绍了Go学习笔记-类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

所谓引用类型

(reference type)特指slice、map、channel这三种预定义类型。

相比数字、数组等类型,引用类型拥有更复杂的存储结构。除分配内存外,它们还须初始化一系列属性,诸如指针、长度,甚至包括哈希分布、数据队列等。

内置函数new按指定类型长度分配零值内存,返回指针,并不关心类型内部构造和初始化方式。而引用类型则必须使用make函数创建,编译器会将make转换为目标类型专用的创建函数(或指令),以确保完成全部内存分配和相关属性初始化。

func mkslice() []int{ 
   s:=make([]int,0,10) 
   s=append(s,100) 
   return s
} 
  
func mkmap()map[string]int{ 
   m:=make(map[string]int) 
   m["a"] =1
   return m
} 
  
func main() { 
   m:=mkmap() 
   println(m["a"]) 
  
   s:=mkslice() 
   println(s[0]) 
}

```c
$go build-gcflags"-l"     // 禁用函数内联 
  
$go tool objdump-s"main\.mk"test
  
TEXT main.mkslice(SB)test.go
   CALL runtime.makeslice(SB) 
  
TEXT main.mkmap(SB)test.go
   CALL runtime.makemap(SB)

//当然,new函数也可为引用类型分配内存,但这是不完整创建。以字典(map)为例,它仅分配了字典类型本身(实际就是个指针包装)所需内存,并没有分配键值存储内存,也没有初始化散列桶等内部属性,因此它无法正常工作。



import"fmt" 
  
func main() { 
   p:=new(map[string]int)      // 函数new返回指针 
   m:= *p            
   m["a"] =1             //panic:assignment to entry in nil map(运行期错误) 
   fmt.Println(m) 
}

类型转换

隐式转换造成的问题远大于它带来的好处。
除常量、别名类型以及未命名类型外,Go强制要求使用显式类型转换。加上不支持操作符重载,所以我们总是能确定语句及表达式的明确含义。

 a:=10
b:=byte(a) 
c:=a+int(b) // 混合类型表达式必须确保类型一致

同样不能将非bool类型结果当作true/false使用。

func main() { 
   x:=100
  
   var b bool=x  // 错误:cannot use x(type int)as type bool in assignment
  
   if x{      // 错误:non-bool x(type int)used as if condition
    } 
}

语法歧义

如果转换的目标是指针、单向通道或没有返回值的函数类型,那么必须使用括号,以避免造成语法分解错误。
func main() { 
   x:=100
   p:= *int(&x)    // 错误:cannot convert&x(type*int)to type int
         //       invalid indirect of int(&x) (type int) 
   println(p) 
}

正确的做法是用括号,让编译器将*int解析为指针类型。

自定义类型

使用关键字type定义用户自定义类型,包括基于现有基础类型创建,或者是结构体、函数类型等。

type flags byte
  
const( 
   read flags=1<<iota
   write
   exec
) 
  
func main() { 
   f:=read|exec
   fmt.Printf("%b\n",f)     // 输出二进制标记位 
}

和var、const类似,多个type定义可合并成组,可在函数或代码块内定义局部类型。

func main() { 
   type(              // 组 
       user struct{          // 结构体 
           name string
           age uint8
        } 
  
       event func(string)bool    // 函数类型 
    ) 
  
   u:=user{"Tom",20} 
   fmt.Println(u) 
  
   var f event=func(s string)bool{ 
       println(s) 
       return s!= "" 
    } 
  



   f("abc") 
}

即便指定了基础类型,也只表明它们有相同底层数据结构,两者间不存在任何关系,属完全不同的两种类型。除操作符外,自定义类型不会继承基础类型的其他信息(包括方法)。不能视作别名,不能隐式转换,不能直接用于比较表达式。

func main() { 
   type data int
   var d data=10
  
   var x int=d       // 错误:cannot use d(type data)as type int in assignment
   println(x) 
  
   println(d==x)      // 错误:invalid operation:d==x(mismatched types data and int) 
}

与有明确标识符的bool、int、string等类型相比,数组、切片、字典、通道等类型与具体元素类型或长度等属性有关,故称作未命名类型(unnamed type)。当然,可用type为其提供具体名称,将其改变为命名类型(named type)。
具有相同声明的未命名类型被视作同一类型。
具有相同基类型的指针。
具有相同元素类型和长度的数组(array)。
具有相同元素类型的切片(slice)。
具有相同键值类型的字典(map)。
具有相同数据类型及操作方向的通道(channel)。
具有相同字段序列(字段名、字段类型、标签,以及字段顺序)的结构体(struct)。
具有相同签名(参数和返回值列表,不包括参数名)的函数(func)。
具有相同方法集(方法名、方法签名,不包括顺序)的接口(interface)。
相关类型会在后续章节做详细说明,此处无须了解更多细节。
容易被忽视的是struct tag,它也属于类型组成部分,而不仅仅是元数据描述。文章来源地址https://www.toymoban.com/news/detail-479546.html

func main() { 
   var a struct{   // 匿名结构类型 
       x int   `x` 
       s string`s` 
    } 
  
   var b struct{ 
       x int
       s string
    } 
  
   b=a      // 错误:cannot use a type
               //      struct{x int"x";s string"s" }as type
               //      struct{x int;s string}in assignment
  
   fmt.Println(b) 
}

到了这里,关于Go学习笔记-类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • python引用from的变量报错Unresolved reference ‘xxxx‘

    我这里是一个文件中集中定义了常量,然后使用from xxxx import xxxx引入 然后发现执行报错: 而且在class中只有这一个def中的xxxx.常量会报错。并且其他def中引用都正常,手打时,pycharm提示也正常。 原因是我在def中for循环中写的是 这里与from重复了导致的报错 如果不是,那就检

    2024年02月10日
    浏览(9)
  • go学习 4、复合数据类型

    go学习 4、复合数据类型

    数组、slice、map和结构体 如何使用结构体来解码和编码到对应JSON格式的数据,并且通过结合使用模板来生成HTML页面 数组和结构体是聚合类型;它们的值由许多元素或成员字段的值组成。数组是由同构的元素组成(每个数组元素都是完全相同的类型);结构体则是由异构的元素

    2024年02月15日
    浏览(11)
  • C++学习笔记---- 引用

    C++学习笔记---- 引用

    给变量起别名 基本语法:数据类型 别名 = 原名 示例: 引用必须初始化 引用在初始化后,不可以改变 int c; //错误,引用必须初始化 示例:   作用:  函数传参时,可以利用引用的技术让形参修饰实参 优点:   可以简化指针修改实参 示例: 作用:  引用是可以作为函数的

    2024年02月11日
    浏览(10)
  • JUC并发编程学习笔记(十九)原子引用

    带版本号的原子操作! 解决ABA问题,引入原子引用(乐观锁思想) AtomicStampedReference类解决ABA问题 所有相同类型的包装类对象之间值的比较全部使用equals方法比较 Integer使用了对象缓存机制,默认范围是-128至127,推荐使用静态工厂方法valueOf获取对象实例,而不是new,因为v

    2024年02月05日
    浏览(12)
  • C++/C:pass-by-value(值传递)与pass-by-reference(引用传递)

    C++/C:pass-by-value(值传递)与pass-by-reference(引用传递)

    c++中新增了引用(reference)的概念,引用可以作为一个已定义变量的别名。 Declares a named variable as a reference, that is, an alias to an already-existing object or function. 基本语法:Type ref = val; 运用定义完成后,相当于目标变量有两个名称,变量名ref实际上是一段连续内存空间的别名 注意事

    2024年02月10日
    浏览(12)
  • 【Winform学习笔记(五)】引用自定义控件库(dll文件)

    【Winform学习笔记(五)】引用自定义控件库(dll文件)

    在本文中主要介绍 如何引用自定义控件库(dll文件)。 通过生成解决方案 或 重新生成解决方案 生成 dll 文件 生成的 dll 文件在 bin 文件夹下的 Debug 文件夹中 点击工具-选择工具箱项 点击浏览 找到刚刚生成的 dll 文件 点击命名空间,确认要导入的控件 点击确定 这时在引用中是

    2024年02月14日
    浏览(15)
  • C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)

    C++标准模板(STL)- 类型支持 (类型特性,is_pointer,is_lvalue_reference,is_rvalue_reference)

    类型特性定义一个编译时基于模板的结构,以查询或修改类型的属性。 试图特化定义于 type_traits 头文件的模板导致未定义行为,除了 std::common_type 可依照其所描述特化。 定义于type_traits头文件的模板可以用不完整类型实例化,除非另外有指定,尽管通常禁止以不完整类型实

    2024年02月08日
    浏览(10)
  • 100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    100天精通Golang(基础入门篇)——第5天: Go语言中的数据类型学习

    🌷 博主 libin9iOak带您 Go to Golang Language.✨ 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批

    2024年02月08日
    浏览(14)
  • 解决python调用opencv时出现cannot find reference ‘imread‘ in __init__ 即cv.imread 未定义引用

    解决python调用opencv时出现cannot find reference ‘imread‘ in __init__ 即cv.imread 未定义引用

    今天终于找到调用cv2未解析的解决办法了,几乎是把全网大多数方式都试了下,总的来说大致有三种原因: 一个是版本不匹配,python的版本和库文件的需求有出入导致无法使用。 一个是不同版本不兼容,下载过多个python版本可能导致这个问题 。 一个是路径设置,这可能不

    2024年02月08日
    浏览(10)
  • 【go语言学习笔记】05 Go 语言实战

    【go语言学习笔记】05 Go 语言实战

    在做项目开发的时候,要善于借助已经有的轮子,让自己的开发更有效率,也更容易实现。 1. RESTful API 定义 RESTful API 是一套规范,它可以规范如何对服务器上的资源进行操作。和 RESTful API 和密不可分的是 HTTP Method。 1.1 HTTP Method HTTP Method最常见的就是POST和GET,其实最早在

    2024年02月13日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包