I expected that type conversion in golang is just to get the code compiled and nothing happens at the runtime. But the following type conversion in golang generates some assembly code.
package main
import (
"fmt"
)
type mystring string
type MyString interface {
get() string
}
func (self mystring) get() string {
return string(self)
}
func main() {
x := newDString("hai")
str := convertToString(x)
fmt.Println("Ans: ", str)
}
func newDString(str string) MyString {
return mystring(str)
}
func convertToString(input MyString) string {
return string(input.(mystring))
}
In the above code, I have a new type mystring
which is just an another name of the built-in type string
. I expected that only the compiler uses this information and nothing gets passed to runtime. I mean, I expected that converting mystring
to string
(and vice versa) must take no processor cycles. But when I did go build -gcflags -S delete.go > test.s
on my code, I see the following assembly code involved in the type conversion. What do these assembly codes do?
"".convertToString t=1 size=122 args=0x20 locals=0x20
0x0000 00000 (/Users/deepak-3207/delete.go:27) TEXT "".convertToString(SB), $32-32
0x0000 00000 (/Users/deepak-3207/delete.go:27) MOVQ (TLS), CX
0x0009 00009 (/Users/deepak-3207/delete.go:27) CMPQ SP, 16(CX)
0x000d 00013 (/Users/deepak-3207/delete.go:27) JLS 115
0x000f 00015 (/Users/deepak-3207/delete.go:27) SUBQ $32, SP
0x0013 00019 (/Users/deepak-3207/delete.go:27) MOVQ BP, 24(SP)
0x0018 00024 (/Users/deepak-3207/delete.go:27) LEAQ 24(SP), BP
0x001d 00029 (/Users/deepak-3207/delete.go:27) FUNCDATA $0, gclocals·c55e845a0a62e9baae6c740db5a20866(SB)
0x001d 00029 (/Users/deepak-3207/delete.go:27) FUNCDATA $1, gclocals·69c1753bd5f81501d95132d08af04464(SB)
0x001d 00029 (/Users/deepak-3207/delete.go:28) MOVQ "".input+40(FP), AX
0x0022 00034 (/Users/deepak-3207/delete.go:28) TESTQ AX, AX
0x0025 00037 (/Users/deepak-3207/delete.go:28) JEQ $0, 43
0x0027 00039 (/Users/deepak-3207/delete.go:28) MOVQ 8(AX), AX
0x002b 00043 (/Users/deepak-3207/delete.go:27) LEAQ type."".mystring(SB), CX
0x0032 00050 (/Users/deepak-3207/delete.go:28) CMPQ CX, AX
0x0035 00053 (/Users/deepak-3207/delete.go:28) JNE $0, 87
0x0037 00055 (/Users/deepak-3207/delete.go:28) MOVQ "".input+48(FP), AX
0x003c 00060 (/Users/deepak-3207/delete.go:28) MOVQ (AX), CX
0x003f 00063 (/Users/deepak-3207/delete.go:28) MOVQ 8(AX), AX
0x0043 00067 (/Users/deepak-3207/delete.go:28) MOVQ CX, "".~r1+56(FP)
0x0048 00072 (/Users/deepak-3207/delete.go:28) MOVQ AX, "".~r1+64(FP)
0x004d 00077 (/Users/deepak-3207/delete.go:28) MOVQ 24(SP), BP
0x0052 00082 (/Users/deepak-3207/delete.go:28) ADDQ $32, SP
0x0056 00086 (/Users/deepak-3207/delete.go:28) RET
0x0057 00087 (/Users/deepak-3207/delete.go:28) MOVQ AX, (SP)
0x005b 00091 (/Users/deepak-3207/delete.go:28) MOVQ CX, 8(SP)
0x0060 00096 (/Users/deepak-3207/delete.go:28) LEAQ type."".MyString(SB), AX
0x0067 00103 (/Users/deepak-3207/delete.go:28) MOVQ AX, 16(SP)
0x006c 00108 (/Users/deepak-3207/delete.go:28) PCDATA $0, $1
0x006c 00108 (/Users/deepak-3207/delete.go:28) CALL runtime.panicdottype(SB)
0x0071 00113 (/Users/deepak-3207/delete.go:28) UNDEF
0x0073 00115 (/Users/deepak-3207/delete.go:28) NOP
0x0073 00115 (/Users/deepak-3207/delete.go:27) PCDATA $0, $-1
0x0073 00115 (/Users/deepak-3207/delete.go:27) CALL runtime.morestack_noctxt(SB)
0x0078 00120 (/Users/deepak-3207/delete.go:27) JMP 0