GO的第二天,赋值和类型
source link: https://studygolang.com/articles/27033
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
元组赋值
赋值,一听这个词,感觉什么都不用说了,就是简单!不过Go还提供了一个元组赋值。元组赋值是另一种形式的赋值语句,它允许同时更新多个变量的值。在赋值之前,赋值语句右边的所有表达式将会先进行求值,然后再统一更新左边对应变量的值。不BB,先看代码:
// 交换两个变量的值 x, y = y, x a[i], a[j] = a[j], a[i]
计算两个整数值的的最大公约数(GCD)
func gcd(x, y int) int { for y != 0 { x, y = y, x%y } return x }
计算斐波纳契数列(Fibonacci)的第N个数
func fib(n int) int { x, y := 0, 1 for i := 0; i < n; i++ { x, y = y, x+y } return x }
是不是很方便?如果你用php去写,是不是这样写 list ( $a, $b ) = array ($b, $a );
。感受一下
可赋值性
可赋值性的规则对于不同类型有着不同要求。对于目前我们已经讨论过的类型,它的规则是简单的:类型必须完全匹配,nil可以赋值给任何指针或引用类型的变量。
类型
一个类型声明语句创建了一个新的类型名称,和现有类型具有相同的底层结构。新命名的类型提供了一个方法,用来分隔不同概念的类型,这样即使它们底层类型相同也是不兼容的。
type 类型名字 底层类型
类型声明语句一般出现在包一级,因此如果新创建的类型名字的首字符大写,则在外部包也可以使用。
为了说明类型声明,我们将不同温度单位分别定义为不同的类型:
package main import "fmt" type Celsius float64 // 摄氏温度 type Fahrenheit float64 // 华氏温度 const ( AbsoluteZeroC Celsius = -273.15 // 绝对零度 FreezingC Celsius = 0 // 结冰点温度 BoilingC Celsius = 100 // 沸水温度 ) func main() { fmt.Printf("%g\n", BoilingC - FreezingC) // "100" °C boilingF := CToF(BoilingC) fmt.Printf("%g\n", boilingF - CToF(FreezingC)) // "180" °F fmt.Printf("%g\n", boilingF - FreezingC) // mismatched types Fahrenheit and Celsius var c Celsius var f Fahrenheit fmt.Println(c == 0) // "true" fmt.Println(f >= 0) // "true" // fmt.Println(c == f) // mismatched types Fahrenheit and Celsius fmt.Println(c == Celsius(f)) // "true"! } func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) } func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }
我们声明了两种类型:Celsius和Fahrenheit分别对应不同的温度单位。它们虽然有着 相同的底层类型float64
,但是它们是 不同的数据类型
,因此它们 不可以
被相互比较或混在一个表达式运算。
对于每一个类型T,都有一个对应的类型转换操作T(x),用于将x转为T类型(如果T是指针类型,可能会需要用小括弧包装T,比如(*int)(0))。只有当两个类型的 底层基础类型相同
时,才允许这种转型操作,或者是两者都是指向 相同底层结构
的指针类型,这些转换只改变类型而不会影响值本身。如果x是可以赋值给T类型的值,那么x必然也可以被转为T类型
下面的声明语句,Celsius类型的参数c出现在了函数名的前面,表示声明的是Celsius类型的一个名叫String的方法,该方法返回该类型对象c带着°C温度单位的字符串:
func (c Celsius) String() string { return fmt.Sprintf("%g°C", c) } c := FToC(212.0) fmt.Println(c.String()) // "100°C" fmt.Printf("%v\n", c) // "100°C"; no need to call String explicitly fmt.Printf("%s\n", c) // "100°C" fmt.Println(c) // "100°C" fmt.Printf("%g\n", c) // "100"; does not call String fmt.Println(float64(c)) // "100"; does not call String
参考
《GO语言圣经》
Recommend
-
62
【市民点50份外卖送陌生人,商家加送10份,外卖平台全额退款】近日,河南开封市民张华在外卖平台点了50份热粥,备注就近送给除雪工人和外卖小哥,商家又加送10多份粥,第二天,外卖平台全额退款,还额外奖励张华500块钱。
-
50
VueConf.US大会第二天会议内容概述
-
38
【近万瓶污水在北京展出:你眼中的污水村民喝了十多年】榆林小壕兔乡村民十几年来一直喝着淡黄色、有味道的污水。艺术家坚果兄弟买下一万瓶纯净水,与农民交换,并将一万瓶污水运到北京和西安,进行展览,希望借此引起相关部门重视。展览第二天,陕西...
-
39
导读 嗨!今天是 netdev 会议的第 2 天,我只参加了早上的会议,但它非常有趣。今早会议的主角是 Van Jacobson 给出的一场名为 “从尽可能快中变化:教网卡以时间”的演讲,它的主题是关于互联网中拥塞控制的未来!!! 下面我将尝试着对我从这...
-
51
文|陈兰 编辑|封成 快播破产清算的消息如同一颗炸弹投入深海,在宅男和非宅男心里激起惊涛骇浪。潜意识里都知道其实快播在王欣入狱时就按下了生命暂停键,但内心深处还是会震撼。就像明明知道病床上躺着的是植物人...
-
57
原标题:刘强东涉嫌强奸案细节曝光:红酒日料夜宴,案发第二天被捕澎湃新闻记者:承天蒙杨鑫倢京东集团创始人、董事局主席刘强东在美国涉嫌强奸案的细节,正进一步清晰。9月5日,华尔街日报援引一位与受害者熟悉的人士的说法称,刘强东以涉嫌强奸被捕,是在
-
52
维秘第二天的复试简直是大型的天使降临现场…迷失在美好肉体的海洋,我落下凡人的眼泪
-
33
特别声明 本文是作者 Tomek Sułkowski 发布在 medium 上的一个系列。 版权归原作者所有。 译者在翻译前已经和作者沟通得到了翻译整个系列的许可。 为了不影响大家阅读,获得许可的记录会放在本文的最后~ 正文 在马上就要迎来假期的这 24 天里
-
58
总觉得睡觉的时候被什么东西压着,第二天起来看监控才发现……
-
7
数组类型别名,类型不同却可以赋值是什么情况 aaaa · 大约6小时之前...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK