...menustart
...menuend
#1.1 变量
var (
a int
b float32
)
data, i := [3]int{0, 1, 2}, 0
i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 10
var s string // 全局变量没问题。
func main() {
i := 0 // Error: i declared and not used。
...
_ = i
}
#1.2 常量
const (
s = "abc"
x // x = "abc"
c = unsafe.Sizeof(b)
)
#1.3 枚举
const (
_ = iota // iota = 0
KB int64=1<<(10*iota) MB //iota=1
GB // 与 KB 表达式相同,但 iota = 2
TB
A,B =iota,iota<<10 // 4, 4<<10
C,D // 5, 5 << 10
)
type Color int
const (
Black Color = iota
Red
Blue
)
#1.4 基本类型
bool
byte
rune Unicode // \uFFFF、\U7FFFFFFF、\xFF
int, int8, 16, 32 ,64 // 071 (8进制), 0x1F(16进制), 1e9, math.MinInt16
uint , ...
float32, 64
complex64, 128
uintptr 指针, nil
array 值类型
struct 值类型
string utf8字符串
slice 引用类型
map 引用类型
channel 引用类型
interface 接口
function 函数
#1.5 引用类型
内置函数new用于分配内存。其语法就是一个函数调用,以类型作为参数。
make 会被编译器翻译 成具体的创建函数,由其分配内存和初始化成员结构,返回对象,而非指指针。
a := []int{0, 0, 0} //表达式初始化
b := make([]int, 3) //make 创建
c := new([]int) //new 创建 , c[1] = 10 会报错
v := new(int) // v的类型为*int
#1.6 类型转换
#1.7 字符串
struct String {
byte* str;
intgo len;
};
索引号访问某字节,如 s[i]。
不能 获取字节元素指针,&s[i] 非法。
不可变类型, 无法修改字节数组
字节数组尾部不包含 NULL
s := `a
b\r\n\x00
c`
s := "Hello, " +
"World!"
s1 := s[:5]
a:='我'
b:="我"
c:='a'
fmt.Printf( "%T,%T,%T,%v,%v,%v", a,b,c ,a,b,c )
// int32,string,int32,25105,我,97
s := "abcd"
bs := []byte(s)
bs[1] = 'B'
println(string(bs)) //aBcd
u := "电脑"
us := []rune(u)
us[1] = '话'
println(string(us)) //电话
通过索引下标 取得的是 byte
for _,v in range 遍历, v 是 rune
#1.8 指针
func main() {
x := 0x12345678
p := unsafe.Pointer(&x)
n := (*[4]byte)(p)
for i := 0; i < len(n); i++ {
fmt.Printf("%X ", n[i]) //78 56 34 12
}
}
func main() {
d := struct {
s string
x int
}{"abc", 100}
p := uintptr(unsafe.Pointer(&d)) // *struct -> Pointer -> uintptr
p += unsafe.Offsetof(d.x) // uintptr + offset
p2 := unsafe.Pointer(p)
px := (*int)(p2)
*px = 200
fmt.Printf("%#v\n", d) //输出: struct { s string; x int }{s:"abc", x:200}
}
注意:GC 把 uintptr 当成普通整数对象,它无法阻止"关联" 对象被回收。
func test() *int {
x := 100
return &x //在堆上分配内存, 但在内联时,也可能直接分配在目标栈。
}
命名类型包括 bool、int、string 等,
array、slice、map 等和 具体元素类型、 长度等 有关,属于未命名类型。
• 具有相同基类型的 指针。
• 具有相同元素类型和长度的 array。
• 具有相同元素类型的 slice。
• 具有相同键值类型的 map。
• 具有相同元素类型和传送方向的 channel。
• 具有相同字段序列 (字段名、类型、标签、顺序) 的匿名 struct。
• 签名相同 (参数和返回值,不包括参数名称) 的 function。
• 方法集相同 ( 方法名、 方法签名相同,和次序无关) 的 interface
func main() {
type bigint int64
var x bigint = 100
println(x) //100
}
不会持有原类型任何信息。
未命名类型, 可以显式转换。
x := 1234
var b bigint = bigint(x) // 必须显式转换,除 是常量。
var s myslice = []int{1, 2, 3} // 未命名类型,隐式转换。