微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang学习笔记:语言规范二

类型转换

形式为 T(x),T是一种类型,x是目标类型表达式。示例

*Point(p)        // same as *(Point(p))
(*Point)(p)      // p is converted to *Point
<-chan int(c)    // same as <-(chan int(c))
(<-chan int)(c)  // c is converted to <-chan int
func()(x)        // function signature func() x
(func())(x)      // x is converted to func()
(func() int)(x)  // x is converted to func() int
func() int(x)    // x is converted to func() int (unambiguous)

常量转换

uint(iota)               // iota value of type uint
float32(2.718281828)     // 2.718281828 of type float32
complex128(1)            // 1.0 + 0.0i of type complex128
float32(0.49999999)      // 0.5 of type float32
string('x')              // "x" of type string
string(0x266c)           // "♬" of type string
MyString("foo" + "bar")  // "foobar" of type MyString
string([]byte{'a'})      // not a constant: []byte{'a'} is not a constant
(*int)(nil)              // not a constant: nil is not a constant,*int is not a boolean,numeric,or string type
int(1.2)                 // illegal: 1.2 cannot be represented as an int
string(65.0)             // illegal: 65.0 is not an integer constant

字符串转换
转换一个无符号或有符号的整数位字符串时,其结果为一个utf-8形式的字符串。

string('a')       // "a"
string(-1)        // "\ufffd" == "\xef\xbf\xbd"
string(0xf8)      // "\u00f8" == "ø" == "\xc3\xb8"
type MyString string
MyString(0x65e5)  // "\u65e5" == "日" == "\xe6\x97\xa5"

转换byte类型的slice为字符串

string([]byte{'h','e','l','\xc3','\xb8'})   // "hellø"
string([]byte{})                                     // ""
string([]byte(nil))                                  // ""

type MyBytes []byte
string(MyBytes{'h','\xb8'})  // "hellø"

转换rune类型的slice为字符串

string([]rune{0x767d, 0x9d6c, 0x7fd4})   // "\u767d\u9d6c\u7fd4" == "白鵬翔"
string([]rune{})                         // ""
string([]rune(nil))                      // ""

type MyRunes []rune
string(MyRunes{0x767d, 0x7fd4})  // "\u767d\u9d6c\u7fd4" == "白鵬翔"
[]byte("hellø")   // []byte{'h','\xb8'}
[]byte("")        // []byte{}

MyBytes("hellø")  // []byte{'h','\xb8'}
[]rune(MyString("白鵬翔"))  // []rune{0x767d,0x9d6c,0x7fd4}
[]rune("")                 // []rune{}

MyRunes("白鵬翔")           // []rune{0x767d,0x7fd4}

常量表达式

常量表达式在编译时可只包含常量操作数和值

const a = 2 + 3.0          // a == 5.0 (untyped floating-point constant)
const b = 15 / 4           // b == 3 (untyped integer constant)
const c = 15 / 4.0         // c == 3.75 (untyped floating-point constant)
const Θ float64 = 3/2      // Θ == 1.0 (type float64,3/2 is integer division)
const Π float64 = 3/2.     // Π == 1.5 (type float64,3/2. is float division)
const d = 1 << 3.0         // d == 8 (untyped integer constant)
const e = 1.0 << 3         // e == 8 (untyped integer constant)
const f = int32(1) << 33   // illegal (constant 8589934592 overflows int32)
const g = float64(2) >> 1  // illegal (float64(2) is a typed floating-point constant)
const h = "foo" > "bar"    // h == true (untyped boolean constant)
const j = true             // j == true (untyped boolean constant)
const k = 'w' + 1          // k == 'x' (untyped rune constant)
const l = "hi"             // l == "hi" (untyped string constant)
const m = string(k)        // m == "x" (type string)
const Σ = 1 - 0.707i       // (untyped complex constant)
const Δ = Σ + 2.0e-4       // (untyped complex constant)
const Φ = iota*1i - 1/1i   // (untyped complex constant)

语句

标签

Error: log.Panic("error encountered")

发送语句

ch <- 3  // send value 3 to channel ch

自增自减语句

IncDec statement    Assignment
x++                 x += 1
x--                 x -= 1

If 语句

if x > max {
    x = max
}
if x := f(); x < y {
    return x
} else if x > z {
    return z
} else {
    return y
}

Switch 语句
表达式switch,用fallthrough 表示继续执行下一个case

switch tag {
default: s3()
case 0,1,2,3: s1()
case 4,5,6,7: s2()
}

switch x := f(); {  // missing switch expression means "true"
case x < 0: return -x
default: return x
}

switch {
case x < y: f1()
case x < z: f2()
case x == 4: f3()
}

类型switch

switch i := x.(type) {
case nil:
    printString("x is nil")                // type of i is type of x (interface{})
case int:
    printInt(i)                            // type of i is int
case float64:
    printFloat64(i)                        // type of i is float64
case func(int) float64:
    printFunction(i)                       // type of i is func(int) float64
case bool,string:
    printString("type is bool or string")  // type of i is type of x (interface{})
default:
    printString("don't kNow the type")     // type of i is type of x (interface{})
}

For 语句

for a < b {
    a *= 2
}

for i := 0; i < 10; i++ {
    f(i)
}

var testdata *struct {
    a *[7]int
}
for i,_ := range testdata.a {
    // testdata.a is never evaluated; len(testdata.a) is constant
    // i ranges from 0 to 6
    f(i)
}

var a [10]string
for i,s := range a {
    // type of i is int
    // type of s is string
    // s == a[i]
    g(i,s)
}

var key string
var val interface {}  // value type of m is assignable to val
m := map[string]int{"mon":0,"tue":1,"wed":2,"thu":3,"fri":4,"sat":5,"sun":6}
for key,val = range m {
    h(key,val)
}
// key == last map key encountered in iteration
// val == map[key]

var ch chan Work = producer()
for w := range ch {
    doWork(w)
}

// empty a channel
for range ch {}

Go 语句
go语句表示启动一条独立的线程或goroutine

GoStmt = "go" Expression
go Server()
go func(ch chan<- bool) { for { sleep(10); ch <- true; }} (c)

Select 语句
select 语句 监听channel上的数据流动,并处理发送和接收数据的操作

var a []int
var c,c1,c2,c3,c4 chan int
var i1,i2 int
select {
case i1 = <-c1:
    print("received ",i1," from c1\n")
case c2 <- i2:
    print("sent ",i2," to c2\n")
case i3,ok := (<-c3):  // same as: i3,ok := <-c3
    if ok {
        print("received ",i3," from c3\n")
    } else {
        print("c3 is closed\n")
    }
case a[f()] = <-c4:
    // same as:
    // case t := <-c4
    // a[f()] = t
default:
    print("no communication\n")
}

for {  // send random sequence of bits to c
    select {
    case c <- 0:  // note: no statement,no fallthrough,no folding of cases
    case c <- 1:
    }
}

select {}  // block forever

延迟执行语句

DeferStmt = "defer" Expression .
lock(l)
defer unlock(l)  // unlocking happens before surrounding function returns

// prints 3 2 1 0 before surrounding function returns
for i := 0; i <= 3; i++ {
    defer fmt.Print(i)
}

// f returns 1
func f() (result int) {
    defer func() {
        result++
    }()
    return 0
}

错误类型

预定义的error接口

type error interface { Error() string }

其他考虑事项

数值类型大小

type                                 size in bytes

byte,uint8,int8                     1
uint16,int16                         2
uint32,int32,float32                4
uint64,int64,float64,complex64     8
complex128

原文地址:https://www.jb51.cc/go/190153.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐