引⽤用型別包括 slice、map 和 channel。它們有複雜的內部結構,除了申請記憶體外,還需
要初始化相關屬性。
內建函式 new 計算型別大小,為其分配零值記憶體,返回指標。⽽而 make 會被編譯器翻譯
成具體的建立函式,由其分配記憶體和初始化成員結構,返回物件而非指標。
a :=
int
// 提供初始化表示式。
a[1] =
10b :=
make(
int,
3) // makeslice
b[1] =
10c :=
new(
int)
c[1] =
10// error: invalid operation: c[1] (index of type *int)
varbbyte =
100// var n int = b // error: cannot use b (type byte) as type int in assignment
varnint =
int(b)
// 顯式轉換
使⽤用括號避免優先順序錯誤。 *
point(p)
// 相當於 *(point(p))
(*point)(p)
<-
chan
int(c)
// 相當於 <-(chan int(c))
(<-
chan
int)(c)
同樣不能將其他型別當 bool 值使⽤用。
a :=
100if a
字串是不可變值型別,內部⽤用指標指向 utf-8 位元組陣列。
•預設值是空字串 ""。
•⽤用索引號訪問某位元組,如 s[i]。
•不能⽤用序號獲取位元組元素指標,&s[i] ⾮非法。
•不可變型別,⽆無法修改位元組陣列。
•位元組陣列尾部不包含 null。
runtime.h
struct string ;
使⽤用索引號訪問字元 (byte)。
s :=
"abc"
println(s[
0] ==
'\x61', s[
1] ==
'b', s[
2] ==
0x63)
輸出:true true true
使⽤用 "`" 定義不做轉義處理的原始字串,⽀支援跨⾏行。
s :=
`ab\r\n\x00
c` println(s)
輸出:ab\r\n\x00
c連線跨⾏行字串時,"+" 必須在上一行末尾,否則導致編譯錯誤。
s :=
"hello, " +
"world!"
s2 :=
"hello, "
+ "world!"
// error: invalid operation: + untyped string
⽀支援⽤用兩個索引號返回⼦子串。⼦子串依然指向原位元組陣列,僅修改了指標和⻓長度屬性。
s :=
"hello, world!"
s1 := s[:
5] // hello
s2 := s[
7:]
// world!
s3 := s[
1:5]
// ello
單引號字元常量表⽰示 unicode code point,⽀支援 \uffff、\u7fffffff、\xff 格式。
對應 rune 型別,ucs-4。
func
main()
輸出:int32 // rune 是 int32 的別名
true true
要修改字串,可先將其轉換成 rune 或 byte,完成後再轉換為 string。⽆無論哪種轉
換,都會重新分配記憶體,並複製位元組陣列。
func
main()
輸出:abcd
**⽤用 for 迴圈遍歷字串時,也有 byte 和 rune 兩種⽅方式。
func
main()
fmt.
println()
for_, r :=
range s }
輸出:a,b,c,æ,±,,å,,,
a,b,c,漢,字,
golang 型別轉換
go 檢視變數型別 reflect.typeof 變數名 int 轉string s strconv.itoa i 等價於 strconv.formatint int i 10 示例 func zhuan int64轉string i int64 123 s strconv.formatint i,...
golang 值型別和引用型別
1.值型別和引用型別 package main import fmt func add num int func addarry arry 3 int func addslice slice int func addmap m map int int func main 值型別 fmt.printl...
引用型別轉換
父類package oop.demo08 public class person 子類package oop.demo08 public class student extends person 測試public class public static void main string args 型...