当前位置: 首页 > wzjs >正文

安阳网站推广西安制作网站公司哪家好

安阳网站推广,西安制作网站公司哪家好,石家庄开发网站,外贸网站推广多少费用目标 了解类型定义不仅告诉编译器如何在内存中存储和处理数据,还对程序设计产生深远影响: 内存结构:类型决定了变量的底层存储(比如占用多少字节、内存布局等)。操作符与方法集:类型决定了哪些内置运算符…

目标

了解类型定义不仅告诉编译器如何在内存中存储和处理数据,还对程序设计产生深远影响:

  • 内存结构:类型决定了变量的底层存储(比如占用多少字节、内存布局等)。
  • 操作符与方法集:类型决定了哪些内置运算符适用于它,以及能否为该类型定义方法,从而扩展它的行为。
  • 语义区分:通过定义新类型,即使它们的底层类型相同,也能明确区分不同概念,避免混用(例如温度单位、索引、文件描述符等)。
  • 可读性与安全性:使用命名类型可以让代码语义更明确,从而降低出错的风险。

概念

  1. 每个变量或表达式都有一个类型,类型描述了值的属性,如数据占用的内存大小、内部结构、支持哪些操作以及关联的方法集等。
  2. 一个 int 类型的变量可能用于表示索引、时间戳或月份;一个 float64 类型的变量可能表示速度或温度。尽管底层都是数字,但语义上却截然不同。
  3. 内存与数据表示:每个数据类型在内存中的表示方式(如整数占用 32 位或 64 位)由其底层类型决定。命名类型会沿用相同的存储方式,但在类型系统中赋予它新的含义。
  4. 方法与接收者
    • **方法的定义:**在 Go 中,可以为任意命名类型定义方法,使得该类型的值具有特定行为(如格式化输出)。
    • 调用示例:fmt.Printf 等函数会自动调用类型的 String 方法,从而定制输出格式。
    • 静态分派:fmt.Printf 等函数会自动调用类型的 String 方法,从而定制输出格式。

要点

类型声明语句

type 新类型名称 底层类型

这条语句创建一个新的类型名称,其底层结构与现有类型相同,但在类型系统中被认为是不同的。例如:

type Celsius float64    // 摄氏温度类型
type Fahrenheit float64 // 华氏温度类型

即使 Celsius 和 Fahrenheit 都基于 float64,它们是两个不同的类型,防止你无意中混用不同温度单位的数据。

  • 命名规则与导出
    • 如果新类型名称的首字符大写,则表示该类型对包外可见(导出)。
    • Go 语言中关于 Unicode 字母的规则也使得中文命名默认不能导出(Go 1 的规则),但在将来的 Go 2 中可能会调整。
  • 用途
    • 语义区分:通过定义不同的命名类型(即使底层相同)可以让程序更安全,不会将代表不同概念的值误用在一起。
    • 简化代码:对于复杂或冗长的类型,用一个简单的名称可以使代码更清晰易读。

类型转换操作

  1. 操作形式

    类型转换写作 T(x),它不会改变 x 的实际值,只是将它“贴上”新的类型标签

    var f Fahrenheit = CToF(BoilingC)
    fmt.Println(Celsius(f)) // 将 f 转换为 Celsius 类型
    
    • 限制:只有当两个类型的底层类型完全相同时,或者都是指向相同底层结构的指针时,才能进行转换。
  2. 作用

    通过类型转换,可以将同样底层数据但语义不同的值显式转换,使得运算和比较变得类型安全。例如

    var c Celsius
    var f Fahrenheit
    // c == f // 编译错误:类型不匹配
    fmt.Println(c == Celsius(f)) // 显式转换后可以比较
    

类型与方法

  1. 方法集

    命名类型不仅是一个新的数据类型,还可以为该类型定义方法,这使得它拥有特定的行为。

    func (c Celsius) String() string {return fmt.Sprintf("%g°C", c)
    }
    

    这段代码为 Celsius 类型定义了一个 String 方法,在调用 fmt.Printf 时会自动调用该方法来格式化输出。(因为 fmt 包会自动调用 String 方法)(具体一点说:当一个类型实现了 String() string 方法后,它就满足了 fmt 包定义的 Stringer 接口。fmt 包在格式化输出时,会检查传入的值是否实现了该接口,如果实现了,就自动调用 String() 方法来获取该值的字符串表示。)

    c := FToC(212.0)
    fmt.Println(c.String()) // 输出 "100°C"
    fmt.Printf("%v\n", c)   // 也输出 "100°C",因为 fmt 包会自动调用 String 方法

    为类型定义方法不仅增加了代码的可读性,也让类型更具语义。

如何定义 Celsius 与 Fahrenheit 两个命名类型及它们之间的转换和方法

// Package tempconv performs Celsius and Fahrenheit temperature computations.
package tempconvimport "fmt"type Celsius float64    // 定义摄氏温度类型
type Fahrenheit float64 // 定义华氏温度类型// 常量声明
const (AbsoluteZeroC Celsius = -273.15 // 绝对零度(摄氏)FreezingC     Celsius = 0       // 冰点(摄氏)BoilingC      Celsius = 100     // 沸点(摄氏)
)// CToF 将摄氏温度转换为华氏温度
func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) 
}// FToC 将华氏温度转换为摄氏温度
func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) 
}// Celsius 的 String 方法,使其输出更友好
func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) 
}
  • Celsius 类型的 String 方法为其提供了定制格式,当使用 fmt 包打印时,会自动调用此方法。

类型比较与运算

  • 支持内置运算符

    因为 Celsius 和 Fahrenheit 的底层类型都是 float64,所以它们可以使用底层类型的算术和比较运算符。例如:

    
    fmt.Printf("%g\n", BoilingC-FreezingC) // 输出 "100"
    boilingF := CToF(BoilingC)
    fmt.Printf("%g\n", boilingF-CToF(FreezingC)) // 输出 "180"
    

    注意,直接将 Fahrenheit 与 Celsius 进行运算会导致编译错误,因为它们是不同的命名类型。

  • 比较运算

    只有相同类型之间才能进行直接比较:

    var c Celsius
    var f Fahrenheit
    fmt.Println(c == 0)          // "true",0 会被视为 Celsius 类型的零值
    fmt.Println(f >= 0)          // "true",同理,0 对于 Fahrenheit 也是零值
    // fmt.Println(c == f)       // 编译错误:类型不匹配
    fmt.Println(c == Celsius(f)) // 正确:通过类型转换后比较
    

总结

  1. 类型定义描述了变量的内存表示、支持的运算符和方法集,同时区分不同的语义。
  2. 将不同的概念定义为不同的命名类型,即使它们底层相同,也能在编译期防止错误的混用。(例如,不小心将温度与文件描述符混用可能引发错误,通过定义不同类型就可以避免这种情况。)
  3. 类型转换 T(x) 只改变 x 的类型标签而不改变底层数据。转换要求两个类型有相同的底层类型或兼容的结构。
  4. 方法与类型行为:为命名类型定义方法(如 String 方法),使得在打印和其它操作时可以自动调用,增强了类型的表现力。
  5. 新类型继承了底层类型的算术与比较操作,但必须保证操作数类型一致。
http://www.dtcms.com/wzjs/792827.html

相关文章:

  • 做网站宁夏百度友情链接
  • 如何解决网站兼容性问题能用网站做微信小程序
  • 四川seo整站优化集团网站制作方案ppt
  • 网站建设的人性分析亚洲国产中文域名查询
  • 网站设计酷站个人与企业签订网站开发合同
  • 怎么做合买彩票网站网站开发从入门到实战
  • wordpress 整站带数据网站建设软文模板
  • 网站安全备案如何注册网站卖东西
  • 重庆网站建设套餐微企申请网站
  • 网页设计与网站建设考试wordpress文章页面500
  • 北京网站建设交易做传销网站后果严重吗
  • 如何在网站中做二级下拉菜单mt4网站建设
  • 网站建设 天津广州涉疫重点场所有更新
  • 门户网站设计特点二级域名查询
  • 专业的网站开发app开发公司入
  • 网站建设路由设置wordpress网站定时更新没有发布
  • 保护环境网站模板上海网站制作公司多少钱
  • php做网站如何广州专业的网站建设公司
  • 空间排版设计网站Wordpress hover插件
  • 如何用h5自己做网站自己怎样做公司广告视频网站
  • 网站建设方案 doc怎么做微信领券网站
  • 上海专业建网站广州专业网站制作公司
  • 珠海网站建设珠海做计算机模拟ie题模拟网站打不开
  • 能进封禁网站的手机浏览器灰产项目网
  • 手机房产网站模板wordpress 好用的编辑器
  • 手机建站怎么做网站流量竞品分析
  • 官方网站开发与定制医疗网站建设效果
  • asp.net网站开发 vs2017美发企业网站模板
  • 华艺网站开发wordpress火车头接口
  • 北京天润建设工程有限公司网站实时新闻热点